Instance()->getSpriteFrameByName(fileList[i]);
19 if (NULL == pFrame)
20 {
21 continue;
22 }
23 animation->addSpriteFrame(pFrame);
24 }
25
26 //设置重复
27 Animate* animate = Animate::create(animation);
28 Repeat* repeat = Repeat::create(animate, CC_REPEAT_FOREVER);
29 m_pAnimateSequence = Sequence::create(repeat, NULL);
30 m_pAnimateSequence->retain();
31 runAction(m_pAnimateSequence);
32 }
33
34 return true;
35 }
这个函数是通过帧序列来初始化。这里有两个输入参数:fileList是图片列表,dura是每张图片之间个时间间隔。如何是骨骼动画呢?看下面这个代码:
1 bool GameObject::initArmature(const std::string& armatureName, float scale)
2 {
3 if (armatureName.length() <= 0)
4 {
5 return true;
6 }
7
8 m_pArmature = cocostudio::Armature::create(armatureName);
9 m_pArmature->setPosition(getContentSize() / 2);
10 m_pArmature->getAnimation()->play(GlobalData::getInstance()->getArmatureData(armatureName)->defaultAction);
11 m_pArmature->setScale(scale);
12
13 addChild(m_pArmature);
14
15 return true;
16 }
首先通过骨骼动画的名称armatureName创建骨骼动画,然后执行默认动作defaultAction(defaultAction是从配置文件中获取的,配置文件的读写将在以后详述)。最后把骨骼动画添加到Sprite上。
这里就有一个疑问了,为什么既要支持帧序列动画,又要支持骨骼动画呢?我们知道骨骼动画的表现形式比帧序列动画更丰富,但是随之而来的问题就是骨骼动画更占资源。如果只有一个简单的动画,或者像子弹那样速度比较快并且数量比较多的游戏对象,应该尽量使用帧序列动画,甚至对于子弹来说,只用单张图片来表现就可以了,根本用不着动画。而对于玩家飞机、boss来说,因为涉及到变形,那就不得不用骨骼动画了。
另外,这里也有一个可以优化的地方。我们可以把GameObject继承自Node,当游戏对象是序列帧动画时,就添加一个Sprite子节点,如果是骨骼动画,就添加一个Armature子节点。
下载参考代码
转载请注明:http://www.cnblogs.com/thorqq/p/5646509.html
下一篇开始,我们将逐个介绍GameObject的子类