2015.3.25--2.cocos精灵移动 动画控制(一)

前端之家收集整理的这篇文章主要介绍了2015.3.25--2.cocos精灵移动 动画控制(一)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
昨天已经成功的创建了一个场景跟一个精灵。
今天研究了很久动画播放。其实播放出来按照教程就可以了。不过远远达不到我们需要的效果 对于动画的控制。
auto animation = Animation::create();
for( int i=1;i<15;i++)
{
char szName[100] = {0};
sprintf(szName,"Images/grossini_dance_%02d.png",i);
animation->addSpriteFrameWithFile(szName);
}
// should last 2.8 seconds. And there are 14 frames.
animation->setDelayPerUnit(2.8f/14);
//animation->setRestoreOriginalFrame(true);
m_pAction = runAction(RepeatForever::create(Animate::create(animation)));

动画创建的代码 从cpp_test里面扣的 这里首先研究了一下Animation对象 发现他是一个动画控制器 包括Animate RepeatForever
其实这里是有一个疑问的 为何都是动画控制器 却又有层级
尤其是 RepeatForeverAnimate 为何一个循环播放的动画控制器一定要在动画控制器之上创建。
我这里先留一个疑问 明日继续研究

其实这里的思路是非常清晰的 用一个资源管理器来保存资源 序列帧 骨骼动画等
截个部分图 官方文档上有很清晰的结构图 值得参照 花了点时间每个都进去看了一下 只是不同的控制器效果的处理主要方式在update上时有所不同。 这里就不一一赘述了。

其实在搞动画播放控制的时候踩了很多坑
1.我想要持久化一个Action对象 用来控制动画的暂停与继续播放,这时候踩到了autoRelese的坑 一直以为是个智能指针,没成想是每tick都会回收被标记为autoRelease的对象 若要持久化 请调用Retain当然 cococs有个更安全的宏 CC_SAFE_RETAIN 个人更推荐使用宏
2.我想要在初始化玩家对象的时候就初始化好所有的动作。
这样我只需要控制动作的播放时机就行了 结果发现我在init的时候创建了动画 然后runAction(这个函数不能被重复执行 不然会挂掉 明天需要研究怎么判定动画的播放状态) 这样会发现哪怕是我pauseTarget也不行,后来发现 cocos对于一个Node对象的创建流程是这样的。create之后 会调用init若需要初始化的代码可以在这里去做一次,然后就是autoRelease 若需要持久化手动调用retain,再之后会进入场景 回调一个onEnter,这里的坑是这样的 onEnter时会调用一次这个Node的resuMetarget 导致我在init时设定的pause又被继续播放了。也就是说 我们要记得 资源等的初始化需要放在init里面 而行为的初始设定需要在进入场景之后进行 也就是onEnter(这里要注意的是 重写基类方法的时候一定要去看一下基类实现 例如 /**
* Event callback that is invoked every time when Node enters the 'stage'.
* If the Node enters the 'stage' with a transition,this event is called when the transition starts.
* During onEnter you can't access a "sister/brother" node.
* If you override onEnter,you shall call its parent's one,e.g.,Node::onEnter().
* @js NA
* @lua NA
*/
virtual void onEnter();
这里一定要记得主动调用基类的方法。)

明天的目标是要找到绑定多个动画并按照不同的(技能)来播放动画 并且绑定自己的模式
这些基础搞完之后 我们就不能在cpp-Test上继续去研究了 已经越写越乱了 导致我今天控制动画时找对应代码都找好久
后天 也就是周一要建立起自己的工程 github也引入 这样在公司跟家里就可以维护一段代码了。

猜你在找的Cocos2d-x相关文章