CCBAnimationManager的使用:使用cocos2d-x程序控制,由cocosBuilder生成cbbi中的动画
2014-04-12 14:31
447 查看
CocosBuilder能方便的编辑各种动画。大部分动画都是以独立片段的形式存在的。需要由程序来控制何时播放。
管理ccbi文件的动画播放有个专门的类:CCBAnimationManager
大致的逻辑是这样的:
所有的动画以动作的形式存在一个CCArray中。
这个ActionManager管理这些动作。
我们现在想做的无非两件事:控制播放动作,当动作结束时得到通知。
我们在cocosBuilder中设置的默认动作,是当Scene层的OnEnter加载完成,就会播放的。
因此要对其中的元素修改,应在onEnter中进行。
好,现在我们面临的第一个问题是当第一个动作结束时,我如何知道?
在这个类中有这样一个函数:
[cpp] view
plaincopyprint?
void setAnimationCompletedCallback(CCObject *target, SEL_CallFunc callbackFunc);
我们可以这样用:
[cpp] view
plaincopyprint?
m_AnimationManager->setAnimationCompletedCallback(this,callfunc_selector(CCBABC::ThisIsCallBack));
回调函数定义如下:
[cpp] view
plaincopyprint?
void ThisIsCallBack();
这样当第一个动作执行完,就会调用这个函数。即使你有一个CCSquence。比如,在cocosBuilder设置了动画链,它也是会被调用的。你唯一要注意的是,这个注册必须在动作结束之前。
好,下面的第二个问题,如何让下一个动作运行。
[cpp] view
plaincopyprint?
void runAnimationsForSequenceNamedTweenDuration(const char *pName, float fTweenDuration);
void runAnimationsForSequenceNamed(const char *pName);
void runAnimationsForSequenceIdTweenDuration(int nSeqId, float fTweenDuraiton);
同样是在CCBAnimationManager中,它们是播放动画的方法。
name即是你在cocosBuilder起的动画名称。fTweenDuration是两个动画之间的间隔。中间那个函数表示没有间隔。
所以,我们可以这样用:
[cpp] view
plaincopyprint?
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。其中会调用:
[cpp] view
plaincopyprint?
CCNode * CCNodeLoader::loadCCNode(CCNode * pParent, CCBReader * pCCBReader) {
CCNode * ccNode = this->createCCNode(pParent, pCCBReader);
//this->parseProperties(ccNode, pParent, pCCBReader);
return ccNode;
}
这个方法。可见由ccbi文件读进来的每一个元素,都是通过Loader中的这个方法创建的。
这个方法是什么?
[cpp] view
plaincopyprint?
#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保存到一个私有变量中就成了。
我这个写到宏里了,凑合看吧 哈
[cpp] view
plaincopyprint?
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保存了这个值。
[cpp] view
plaincopyprint?
void CCBObject::setAnimationManager(CCBAnimationManager *pAnimationManager)
{
SAFE_RELEASE(mAnimationManager);
m_AnimationManager = pAnimationManager;
SAFE_RETAIN(mAnimationManager);
}
ok,这样一来就可以操作cbbi中的AnimationManager了,当然也就可以自由控制动画的流程啦~
管理ccbi文件的动画播放有个专门的类:CCBAnimationManager
大致的逻辑是这样的:
所有的动画以动作的形式存在一个CCArray中。
这个ActionManager管理这些动作。
我们现在想做的无非两件事:控制播放动作,当动作结束时得到通知。
我们在cocosBuilder中设置的默认动作,是当Scene层的OnEnter加载完成,就会播放的。
因此要对其中的元素修改,应在onEnter中进行。
好,现在我们面临的第一个问题是当第一个动作结束时,我如何知道?
在这个类中有这样一个函数:
[cpp] view
plaincopyprint?
void setAnimationCompletedCallback(CCObject *target, SEL_CallFunc callbackFunc);
我们可以这样用:
[cpp] view
plaincopyprint?
m_AnimationManager->setAnimationCompletedCallback(this,callfunc_selector(CCBABC::ThisIsCallBack));
回调函数定义如下:
[cpp] view
plaincopyprint?
void ThisIsCallBack();
这样当第一个动作执行完,就会调用这个函数。即使你有一个CCSquence。比如,在cocosBuilder设置了动画链,它也是会被调用的。你唯一要注意的是,这个注册必须在动作结束之前。
好,下面的第二个问题,如何让下一个动作运行。
[cpp] view
plaincopyprint?
void runAnimationsForSequenceNamedTweenDuration(const char *pName, float fTweenDuration);
void runAnimationsForSequenceNamed(const char *pName);
void runAnimationsForSequenceIdTweenDuration(int nSeqId, float fTweenDuraiton);
同样是在CCBAnimationManager中,它们是播放动画的方法。
name即是你在cocosBuilder起的动画名称。fTweenDuration是两个动画之间的间隔。中间那个函数表示没有间隔。
所以,我们可以这样用:
[cpp] view
plaincopyprint?
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。其中会调用:
[cpp] view
plaincopyprint?
CCNode * CCNodeLoader::loadCCNode(CCNode * pParent, CCBReader * pCCBReader) {
CCNode * ccNode = this->createCCNode(pParent, pCCBReader);
//this->parseProperties(ccNode, pParent, pCCBReader);
return ccNode;
}
这个方法。可见由ccbi文件读进来的每一个元素,都是通过Loader中的这个方法创建的。
这个方法是什么?
[cpp] view
plaincopyprint?
#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保存到一个私有变量中就成了。
我这个写到宏里了,凑合看吧 哈
[cpp] view
plaincopyprint?
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保存了这个值。
[cpp] view
plaincopyprint?
void CCBObject::setAnimationManager(CCBAnimationManager *pAnimationManager)
{
SAFE_RELEASE(mAnimationManager);
m_AnimationManager = pAnimationManager;
SAFE_RETAIN(mAnimationManager);
}
ok,这样一来就可以操作cbbi中的AnimationManager了,当然也就可以自由控制动画的流程啦~
相关文章推荐
- CCBAnimationManager的使用:使用cocos2d-x程序控制,由cocosBuilder生成cbbi中的动画
- Cocos2d-x游戏开发CCBAnimationManager控制动画播放
- Cocos2d-x游戏开发CCBAnimationManager控制动画
- cocos2d-x-2.0.4中使用CocosBuilder创建动画注意的问题
- 使用CocosBuilder2.1结合cocos2d-x2.0.3创建动画场景
- 使用CocosBuilder2.1结合cocos2d-x2.0.3创建动画场景
- 使用CocosBuilder2.1结合cocos2d-x2.0.3创建动画场景
- cocosBuilder生成cbbi文件,绑定到cocos2d-x
- 如何使用CocosBuilder2.1结合cocos2d-x2.0.3创建动画场景
- 如何使用CocosBuilder2.1结合cocos2d-x2.0.3创建动画场景 分享0
- 使用CocosBuilder2.1结合cocos2d-x2.0.3创建动画场景
- 使用CocosBuilder2.1结合cocos2d-x2.0.3创建动画场景
- Cocos2d-x——CocosBuilder官方帮助文档翻译3 动画
- 【CocosBuilder 开发系列之一】cocos2dx使用CocosBuilder完成骨骼动画
- Unity用程序给Animator控制的某一个动画(AnimationClip)加一个动画事件(AnimationEvent)
- cocos2dx使用CocosBuilder(官方编辑器)完成基础骨骼动画
- cocos2d-x2.1 + cocosbuilder3.0 的自动生成C++类的修改
- 【如何用CocosStudio1.5编辑骨骼动画动画供程序开发人员使用】
- 实习小白::(转) cocos2d-x使用cocosStudio编辑的动画文件
- 【CocosBuilder 开发系列之一】cocos2dx使用CocosBuilder(编辑器)完成基础骨骼动画