CCBAnimationManager的使用:使用cocos2d-x程序控制,由cocosBuilder生成cbbi中的动画

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.   
  4.     //this->parseProperties(ccNode, pParent, pCCBReader);  
  5.   
  6.     return ccNode;  
  7. }  

这个方法。可见由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保存了这个值。

  1. void CCBObject::setAnimationManager(CCBAnimationManager *pAnimationManager)  
  2. {  
  3.     SAFE_RELEASE(mAnimationManager);  
  4.     m_AnimationManager = pAnimationManager;  
  5.     SAFE_RETAIN(mAnimationManager);  
  6. }  

  ok,这样一来就可以操作cbbi中的AnimationManager了,当然也就可以自由控制动画的流程啦~
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值