博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Cocos2d-x游戏开发CCBAnimationManager控制动画
阅读量:5328 次
发布时间:2019-06-14

本文共 2390 字,大约阅读时间需要 7 分钟。

CocosBuilder能方便的编辑各种动画。大部分动画都是以独立片段的形式存在的。

须要由程序来控制何时播放。

管理ccbi文件的动画播放有个专门的类:CCBAnimationManager

大致的逻辑是这种:

全部的动画以动作的形式存在一个CCArray中。

这个ActionManager管理这些动作。

我们如今想做的无非两件事:控制播放动作,当动作结束时得到通知。

我们在cocosBuilder中设置的默认动作。是当Scene层的OnEnter载入完毕,就会播放的。

因此要对当中的元素改动,应在onEnter中进行。

好。如今我们面临的第一个问题是当第一个动作结束时,我怎样知道?

在这个类中有这样一个函数:

  1. void setAnimationCompletedCallback(CCObject *target, SEL_CallFunc callbackFunc);
我们能够这样用:
  1. m_AnimationManager->setAnimationCompletedCallback(this,callfunc_selector(CCBABC::ThisIsCallBack));

回调函数定义例如以下:

  1. void ThisIsCallBack();
这样当第一个动作运行完,就会调用这个函数。

即使你有一个CCSquence。

比方,在cocosBuilder设置了动画链,它也是会被调用的。你唯一要注意的是。这个注冊必须在动作结束之前。

好。以下的第二个问题,怎样让下一个动作执行。

  1.     void runAnimationsForSequenceNamedTweenDuration(const char *pName, float fTweenDuration);
  2.     void runAnimationsForSequenceNamed(const char *pName);
  3.     void runAnimationsForSequenceIdTweenDuration(int nSeqId, float fTweenDuraiton);
相同是在CCBAnimationManager中,它们是播放动画的方法。

name即是你在cocosBuilder起的动画名称。fTweenDuration是两个动画之间的间隔。中间那个函数表示没有间隔。

所以,我们能够这样用:

  1. void CCBAbc::ThisIsCallBack()
  2. {
  3.         //do some change
  4.         //......
  5.         mAnimationManager->setAnimationCompletedCallback(this,callfunc_selector(CCBAbc::showOutCallBack));
  6.         mAnimationManager->runAnimationsForSequenceNamed("showOut");
  7. }

这样我们就能将一串动作串起来了!

知道了怎么控制动画之后。还有个问题,就是怎样把cbbi的CCBAnimationManager找到呢?

这就要从extensions\CCBReader\CCNodeLoader.cpp这个文件说起了。

当调用CCBReader::readNodeGraph方法是。会Load对应的Node。当中会调用:

  1. CCNode * CCNodeLoader::loadCCNode(CCNode * pParent, CCBReader * pCCBReader) {
  2.     CCNode * ccNode = this->createCCNode(pParent, pCCBReader);
  3.     //this->parseProperties(ccNode, pParent, pCCBReader);
  4.     return ccNode;
  5. }

这种方法。可见由ccbi文件读进来的每个元素,都是通过Loader中的这种方法创建的。

这种方法是什么?

  1. #define CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(T) virtual T * createCCNode(cocos2d::CCNode * pParent, cocos2d::extension::CCBReader * pCCBReader) { \
  2.     return T::create(); \
  3. }

就是创建一个CCNode而已。

我们要做的就是重写这种方法,原理是由于我们要调用CCBReader中的getAnimationManager()这种方法。将得到的manager保存到一个私有变量中就成了。

我这个写到宏里了,凑合看吧  哈

  1. virtual T* createCCNode(cocos2d::CCNode * pParent, cocos2d::extension::CCBReader * pCCBReader)        \
  2.         {        \
  3.                 T * pRet = new T();        \
  4.                 if (pRet && pRet->init())        \
  5.                 {        \
  6.                         pRet->autorelease();        \
  7.                         pRet->setAnimationManager( pCCBReader->getAnimationManager() );        \
  8.                 }        \
  9.                 else        \
  10.                 {        \
  11.                         CC_SAFE_DELETE(pRet);        \
  12.                 }        \
  13.                 return pRet;        \
  14.         }        \
当中setAnimationManager保存了这个值。
ok。这样一来就能够操作cbbi中的AnimationManager了,当然也就能够自由控制动画的流程啦~
转自

转载于:https://www.cnblogs.com/hrhguanli/p/4842396.html

你可能感兴趣的文章
bzoj4407: 于神之怒加强版
查看>>
从qplot开始
查看>>
mysql统计一张表中条目个数的方法
查看>>
ArcGIS多面体(multipatch)解析——引
查看>>
C++ 软件开发多国语言解决方案汇总
查看>>
JS 在火狐浏览器下关闭弹窗
查看>>
css3渐变画斜线 demo
查看>>
UIView中的坐标转换
查看>>
JS性能DOM优化
查看>>
设计模式 单例模式 使用模板及智能指针
查看>>
c++11 多线程依次打印ABC
查看>>
c#的const可以用于引用类型吗
查看>>
手动实现二值化
查看>>
What Linux bind mounts are really doing
查看>>
linux top命令详解
查看>>
博弈论小结
查看>>
模拟Post登陆带验证码的网站
查看>>
预科阶段:快速实战入门
查看>>
CentOS下安装配置MySQL8.0的步骤详解
查看>>
NYOJ458 - 小光棍数
查看>>