CocosBuilder能方便的编辑各种动画。大部分动画都是以独立片段的形式存在的。 须要由程序来控制何时播放。
管理ccbi文件的动画播放有个专门的类:CCBAnimationManager
大致的逻辑是这种:
全部的动画以动作的形式存在一个CCArray中。
这个ActionManager管理这些动作。
我们如今想做的无非两件事:控制播放动作,当动作结束时得到通知。
我们在cocosBuilder中设置的默认动作。是当Scene层的OnEnter载入完毕,就会播放的。
因此要对当中的元素改动,应在onEnter中进行。
好。如今我们面临的第一个问题是当第一个动作结束时,我怎样知道?
在这个类中有这样一个函数:
-
void setAnimationCompletedCallback(CCObject *target, SEL_CallFunc callbackFunc);
我们能够这样用:
-
m_AnimationManager->setAnimationCompletedCallback(this,callfunc_selector(CCBABC::ThisIsCallBack));
回调函数定义例如以下:
这样当第一个动作运行完,就会调用这个函数。即使你有一个CCSquence。 比方,在cocosBuilder设置了动画链,它也是会被调用的。你唯一要注意的是。这个注冊必须在动作结束之前。
好。以下的第二个问题,怎样让下一个动作执行。
-
void runAnimationsForSequenceNamedTweenDuration(const char *pName, float fTweenDuration);
-
void runAnimationsForSequenceNamed(const char *pName);
-
void runAnimationsForSequenceIdTweenDuration(int nSeqId, float fTweenDuraiton);
相同是在CCBAnimationManager中,它们是播放动画的方法。
name即是你在cocosBuilder起的动画名称。fTweenDuration是两个动画之间的间隔。中间那个函数表示没有间隔。
所以,我们能够这样用:
-
void CCBAbc::ThisIsCallBack()
-
{
-
//do some change
-
//......
-
mAnimationManager->setAnimationCompletedCallback(this,callfunc_selector(CCBAbc::showOutCallBack));
-
mAnimationManager->runAnimationsForSequenceNamed("showOut");
-
}
这样我们就能将一串动作串起来了!
知道了怎么控制动画之后。还有个问题,就是怎样把cbbi的CCBAnimationManager找到呢?
这就要从extensions\CCBReader\CCNodeLoader.cpp这个文件说起了。
当调用CCBReader::readNodeGraph方法是。会Load对应的Node。当中会调用:
-
CCNode * CCNodeLoader::loadCCNode(CCNode * pParent, CCBReader * pCCBReader) {
-
CCNode * ccNode = this->createCCNode(pParent, pCCBReader);
-
-
//this->parseProperties(ccNode, pParent, pCCBReader);
-
-
return ccNode;
-
}
这种方法。可见由ccbi文件读进来的每个元素,都是通过Loader中的这种方法创建的。
这种方法是什么?
-
#define CCB_VIRTUAL_NEW_AUTORELEASE_CREATECCNODE_METHOD(T) virtual T * createCCNode(cocos2d::CCNode * pParent, cocos2d::extension::CCBReader * pCCBReader) { \
-
return T::create(); \
-
}
就是创建一个CCNode而已。
我们要做的就是重写这种方法,原理是由于我们要调用CCBReader中的getAnimationManager()这种方法。将得到的manager保存到一个私有变量中就成了。
我这个写到宏里了,凑合看吧 哈
-
virtual T* createCCNode(cocos2d::CCNode * pParent, cocos2d::extension::CCBReader * pCCBReader) \
-
{ \
-
T * pRet = new T(); \
-
if (pRet && pRet->init()) \
-
{ \
-
pRet->autorelease(); \
-
pRet->setAnimationManager( pCCBReader->getAnimationManager() ); \
-
} \
-
else \
-
{ \
-
CC_SAFE_DELETE(pRet); \
-
} \
-
return pRet; \
-
} \
当中setAnimationManager保存了这个值。
ok。这样一来就能够操作cbbi中的AnimationManager了,当然也就能够自由控制动画的流程啦~
转自http://blog.csdn.net/fansongy/article/details/8937210 |