最近学习了下cocos2dx的源码,这里简单的备注下 ActionManger 的实现:
首先看下ccnode的关于action的方法:
CCAction * CCNode::runAction(CCAction* action) |
CCAssert( action != NULL, "Argument must be non-nil" ); |
m_pActionManager->addAction(action, this , !m_bRunning); |
void CCNode::stopAllActions() |
m_pActionManager->removeAllActionsFromTarget( this ); |
void CCNode::stopAction(CCAction* action) |
m_pActionManager->removeAction(action); |
void CCNode::stopActionByTag( int tag) |
CCAssert( tag != kCCActionTagInvalid, "Invalid tag" ); |
m_pActionManager->removeActionByTag(tag, this ); |
CCAction * CCNode::getActionByTag( int tag) |
CCAssert( tag != kCCActionTagInvalid, "Invalid tag" ); |
return m_pActionManager->getActionByTag(tag, this ); |
unsigned int CCNode::numberOfRunningActions() |
return m_pActionManager->numberOfRunningActionsInTarget( this ); |
可以发现,其实全部是ActionManager来管理的。
ActionManager:
ActionManager主要用来管理ccnode的actions,它的初始化流程代码如下,
bool CCDirector::init( void ) |
m_pScheduler = new CCScheduler(); |
m_pActionManager = new CCActionManager(); |
m_pScheduler->scheduleUpdateForTarget(m_pActionManager, kCCPrioritySystem, false ); |
CCDirector *director = CCDirector::sharedDirector(); |
m_pActionManager = director->getActionManager(); |
m_pActionManager->retain(); |
void CCActionManager::update( float dt) |
m_pCurrentTarget->currentAction->step(dt); |
通过代码分析可以发现,ActionManager其实是在不停的在update方法中轮询的调用node的各个action的step方法,即cocos2dx里node的各种action都是在ActionManager中被轮询调用和执行。
CCActionManager代码还是比较多的,但是大都是细节处理代码,比如链表和数组的操作,以及为了防止特殊情况(动画的执行中有停止,移除自己的逻辑)下的数据异常,进行的规避代码等。去除了这些之后,整个流程就很简单了。
发表评论