骨骼动画 vs. 精灵表(sprite sheets)

创建动画又快又简单的方法是使用“精灵表”(sprite sheets).当你意识到游戏需要大量动画,内存消耗会涨上来,而且需要耗时去加载所有数据.此外,限于大小,你需要为了动画限制自己使用低FPS,这意味着动画不是你想要的那么平滑.这就是骨骼动画的由来.

骨骼动画简述

骨骼动画是cocos2d-x动画在人物渲染方面的技术,分二个部分:用于绘制人物的外观呈现(被称为蒙皮或者mesh)和用于mesh进行动画(造型和关键帧) 的一组分层的相互连接的骨骼.

骨骼动画的优势?

1 骨骼绑定可以让动画更精准,更真实自然,并可通过程序动态控制

2 动画各部分采用拼接方式,占用位图/内存资源少

3 骨骼显示对象与骨骼的逻辑分离,可在不影响动画播放的情况下动态更换

在你的应用中,Cocos2d-x提供了拥有2d骨骼动画的方式.构建骨骼动画过程开始可能有点复杂,但随后用起来却非常简单,而且有一些工具可以简化此过程.

当使用骨骼动画时,动画由一些相互连接的骨骼组成。影响一个骨骼将会影响其所有的子对象。通过每根骨头上不同的变换组合,你会得到骨骼的各种造型。

现在,如果你定义了关键帧,即某个时间点骨骼中每根骨头特定的变换,你就能在关键帧之间插入平滑的过渡,从而使骨骼运动。

在附加的代码中,我使用一个名叫Transformation的类,它含有2D变换的数据,如translation(平移)、rotation(旋转)和scale(缩放)。通过帧的编号和一个Transformation能定义一个关键帧。关键帧的集合定义了一个KeyFrameAnimation.最后,骨骼动画就是一个KeyFrameAnimation的集合,每个KeyFrameAnimation应用于骨骼中的每根骨头。

另外,你使用骨骼,它保存了关节列表,关节定义了骨骼中骨头的层级。不同于“精灵表”,每根骨头指定了特定的texture,如下所示:

骨骼动画工具

据我们所知,在创建骨骼动画方面CocosBuilder是一个不错的、免费(MIT协议)的工具。

CocosBuilder为Cocos2d的Javascript绑定而创建的。这意味着你的代码、动画和接口会无修改地在Cocos2d-x中运行。

cocos2d-iphone的教程可以在Zynga Engineering blog找到。

与cocosbuilder动画协作

你可以使用CocosBuilder创建人物动画,全场景动画或者你所想的任何动画。该动画编辑器已完全支持多分辨率、关键帧间的缓冲动画、骨骼动画和多时间轴等特性。

基础

在主窗口的下部,你可以找到时间轴。你可以使用时间轴来创建你的动画。

默认情况下你的ccb-file只有一条时长10秒的时间轴。CocosBuilder编辑动画的帧率是每秒30帧,但是当你在应用程序中回放动画时,会使用你给cocos2d设置的帧率(cocos2d中默认是60fps)。当前时间会在右上角显示,格式是分:秒:帧。蓝色垂直线也显示了当前时间。单击显示时间以更改当前时间线的时间间隔。

增加 Keyframes

CocosBuilder中的动画是基于关键帧的。你可以添加关键帧以设置node的不同属性并且CocosBuilder会自动在关键帧间插入不同类型的可选(ease)缓冲动作。

为了添加关键帧,首先通过点击node名字右边的三角形展开node的视图。上面会展现该node所有可动画的属性。基于你选择的node类型,可以动画的属性会稍微有点不一样。凡是可见的属性,你可以在时间轴中按住option键并点击该属性。在点击的那个时间点就会创建新的关键帧。或者,你可以通过选择一个node再在Animation菜单中选Insert Keyframe从而在时间标志器的那个时间点生成一个新的关键帧。

如果你在画布区域变换一个node,并且该node所变换的属性在时间轴上已经有一个或多个关键帧,那么CocosBuilder会自动在当前时间点添加关键帧。

编辑 Keyframes

移动时间标志器至特定关键帧的时间点并选择该node,编辑该关键帧。你可以通过双击关键帧聚焦于该帧(聚焦即选择该node并移动时间标志器)。

你可以选择关键帧并通过拖拉它们周围的选择框来移动它们。你也可以在node间复制、黏贴关键帧。当黏贴关键帧时,确保你只选择了一个node。关键帧会黏贴在时间标志线标志的时间。

如果你已经选择了一系列关键帧,可以通过选择Animation菜单中的Reverse Selected Keyframes来反向关键帧的次序。使用Stretch Selected Keyframes选项可以通过一个缩放因子来加速或者减速动画。

导入多张连续图片

如果你通过sprite frame帧组创建动画,需要冗长的时间来将每个独立的帧移至时间轴上。CocosBuilder通过自动导入图像序列简化了这一过程。选择你想要导入到左边项目视图的帧,然后选择时间轴上的一个CCSprite。现在选择Animation菜单中的Create Frames from Selected Resources.这些帧会在时间标志线开始的地方添加。如果你需要放慢动画,选择新创建的关键帧组,并使用Stretch Selected Keyframes…命令。

应用渐变

CocosBuilder提供了cocos2d给予的一些精心挑选的缓冲动作(easing)子集。应用一个缓冲动作只需在两个关键帧之间右键点击并选择你想应用的缓冲动作的类型即可。

一些缓冲动作有额外的选项,在应用缓冲动作之后,你可以再次右击并从弹出菜单中选择Easing Setting…。

使用多个时间轴

CocosBuilder的动画编辑器有一个非常强大的特性就是在单个文件中可以含有多个时间轴。你可以命名不同的序列并通过它们的名字从代码中播放它们。在不同的时间轴之间会有平滑的过渡。

在选择之前,使用时间轴弹出菜单添加并编辑你的时间轴:

在编辑时间轴的对话框中,你可以获得时间轴的大致信息、重命名它们、添加新的时间轴以及(可选)设置时间轴中的一条在ccbi文件从你的应用程序加载后立即自动开始播放。

没有设置关键帧的时间轴中的属性会在时间轴时间共享它们的值。例如,如果你移动某条的一个node,只要它没有为位置属性设置关键帧,它就会在所有的时间轴中被移动。有时,我觉得为一个特定的时间轴添加单个关键帧来覆盖共享值是挺有用的。

锁定时间轴

你可以通过锁定时间轴来自动回放时间轴序列。你也可以使用这个特性来自动重播一个时间轴。

为了播放时间轴序列中的一个时间轴,点击No chained timeline文本并选择当前时间轴后你想播放的那个。

通过代码播放动画

想要通过代码控制你用CocosBuilder创建的动画,你需要检索CCBAnimationManager。当ccbi文件加载时,该动画管理器将分配node userObject。

  1. CCNode *myNodeGraph = ccbReader->readNodeGraphFromFile("myFile.ccbi", this);

动作管理器会作为一个自动释放对象返回。回放特定的时间轴需调用runAnimationsForSequenceNamed: 方法。如果时间轴当前正在播放,当调用此方法时它会立刻停止。

  1. animationManager->runAnimationsForSequenceNamed("My Timeline");

或者,你可以使用时间轴之间的时间间隔来平滑过渡到新的时间轴。一般情况下线性插入会应用于此过渡。

  1. animationManager->runAnimationsForSequenceNamedTweenDuration("My Timeline",0.5f);

也可以在时间轴播放完毕后接收一个回调。即使另外的时间轴锁在序列中,你也能接收到这些回调。你可以用CCBAnimationManagerDelegate来接收回调。

总结

谢谢你们花时间来阅读本教程,祝编程愉快!如果你有其他骨骼动画的动作,请通知我们或者发邮件到此wiki。

参考

Creating a game with cocosbuilder

DragonBones

  DragonBones是一套开源的 2D骨骼动画框架和工具,它包含了基于Flash Pro的骨骼动画编辑面板.DragonBonesDesignPanel及骨骼动画ActionScript框架。它可以让开发者运用熟悉的Flash Pro元

件及时间轴编辑方式,快速创建2D骨骼动画,并运用到Flash或其他技术的应用中.DragonBones在cocoStudio适配下可以用于cocos2d-x.DragonBones快速指南:http://dragonbones.github.io/getting_started_cn.html DragonBones

DragonBone  and cocos2d-x

1 zengrong修改的DragonBone插件,为cocos2d-x专用.下载地址: http://zengrong.net/download/115/

2 导出zip格式。

3 导出的zip分为两部分,一个xml文件包括骨骼的信息,以及导出的图片。

4 将zip解压,打开cocostudio动作编辑器.导入flash项目,要选择解压的skeleton_and_texture.xml

5通过cocostudio导出的包括三个文件

6 在代码中使用 ,

   CCArmatureDataManager::sharedArmatureDataManager()->addArmatureFileInfo("warr0.png", "warr0.plist", "warr.ExportJson");CCArmature *armature = CCArmature::create("warr");armature->getAnimation()->playByIndex(3);armature->setScale(0.5f);armature->setPosition(ccp(visibleSize.width * 0.5, visibleSize.height * 0.5));this->addChild(armature,2);

要注意的是CCArmature::create(“warr”);这个要在ExportJson中描述的name一样

运行效果

参考: http://zengrong.net/post/1915.htm

http://zengrong.net/post/1911.htm




cocos2d-x 骨骼动画详解相关推荐

  1. 骨骼动画详解-Cocos Studio

    任珊原创,首发于泰然,转载请注明出处 https://github.com/chukong/cocos-docs/blob/master/manual/framework/native/v3/spin ...

  2. 骨骼动画详解 和 帧动画

     骨骼动画 vs. 精灵表(sprite sheets) 创建动画又快又简单的方法是使用"精灵表"(sprite sheets).当你意识到游戏需要大量动画,内存消耗会涨上来, ...

  3. Unity载入骨骼动画详解

    Spine Skeleton Animation(2D骨骼动画) 骨骼动画 首先我们来看到底什么是骨骼动画: 在早期的机器上,渲染本身已经占用了很多CPU资源,因此,对于渲染,往往采取的是一种空间换时 ...

  4. 使用Spine制作柔性的骨骼动画详解

    缘起是要实现一个需求,即寻找一个能制作如下图所示腿部弯曲动画的工具. 由于要求不能使用序列帧动画,因为一旦弯曲效果不理想需要全部重画,美术的工作量会很大,而且序列帧动画的图量也会很大. 一番寻找后,发 ...

  5. Unity中的Animator动画详解

    Unity中的Animator动画详解 Animator动画导入 Animator动画详解 动画类型选择 Rig面板属性 Mode面板属性 Animation面板属性 动画片段 控制使用 Animat ...

  6. Cocos2d之Node类详解之节点树(二)

    一.声明 本文属于笔者原创,允许读者转载和分享,只要注明文章来源即可. 笔者使用cocos2d框架的cocos2d-x-3.3rc0版本的源代码做分析.这篇文章承接上篇<Cocos2d之Node ...

  7. iOS核心动画详解swift版----基础动画

    2019独角兽企业重金招聘Python工程师标准>>> iOS核心动画详解swift版---基础动画 创建工程,添加2个ViewController,通过rootViewContro ...

  8. [转] ReactNative Animated动画详解

    http://web.jobbole.com/84962/ 首页 所有文章 JavaScript HTML5 CSS 基础技术 前端职场 工具资源 更多频道▼ - 导航条 -首页所有文章JavaScr ...

  9. Android Animation动画详解(二): 组合动画特效

    前言 上一篇博客Android Animation动画详解(一): 补间动画 我已经为大家介绍了Android补间动画的四种形式,相信读过该博客的兄弟们一起都了解了.如果你还不了解,那点链接过去研读一 ...

最新文章

  1. 5款实用的硬盘、SSD固态硬盘、U盘、储存卡磁盘性能测试工具绿色版
  2. VTK:相互作用之TrackballCamera
  3. 新一代JavaScript标准,ES6即将发布
  4. idea解决lombok注解失效问题
  5. [翻译]超炫列表动画的实现
  6. CocoaChina2013开发者大会演讲稿-主会场-陈昊芝
  7. SSH学习(一)—— 基础概念篇
  8. java线程池正确使用姿势
  9. 个人电子邮箱怎么注册?
  10. 计算机的奇迹英语作文,高中英语作文范文:奇迹
  11. java计算机毕业设计公立医院绩效考核系统源码+mysql数据库+系统+lw文档+部署
  12. 取十六进制的后两位数、中间两位数,以及高位数
  13. 这些你必须知道的 Linux 技能
  14. 有两个表A和B,均有key和value两个字段,如果B的key在A中也有,就把B的value替换为A中对应的value...
  15. Spark RDD简介
  16. vue开发的音乐小播放器
  17. c/c++中sizeof()、strlen()、length()、size()详解和区别
  18. 2020-09-10 MYSQL按时间段分组查询当天,每小时,15分钟数据分组
  19. android app自动化测试框架Appium资料整理
  20. JS 实现段落展开和收起的显示

热门文章

  1. 如何在MySQL中导入SQL文件
  2. 2021 第五空间 ctf wp
  3. 14英寸MateBook D AMD不能增加内存条
  4. 关于烟草的知识(我不吸烟)
  5. 传奇私服脚本解密器的研究
  6. firework导出html到dw,dw4 应用基础之firework 文件详解
  7. java土豪笑话_调侃土豪的段子 土豪笑话段子大全
  8. 2018-2019-2 20189206 《网络攻防实践》 第六周作业
  9. 海南省地图geo JSON 带群岛
  10. egret.eui皮肤与组件(2)