最近学习了下cocos2dx的源码,这里简单的备注下 ActionManger 的实现:
CONTENTS
首先看下ccnode的关于action的方法:
CCAction * CCNode::runAction(CCAction* action) { CCAssert( action != NULL, "Argument must be non-nil"); m_pActionManager->addAction(action, this, !m_bRunning); return action; } 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(); // action manager m_pActionManager = new CCActionManager(); m_pScheduler->scheduleUpdateForTarget(m_pActionManager, kCCPrioritySystem, false); 。。。。。 。。。。。 return true; } CCNode::CCNode(void) 。。。。。 。。。。。 { // set default scheduler and actionManager CCDirector *director = CCDirector::sharedDirector(); m_pActionManager = director->getActionManager(); m_pActionManager->retain(); } // main loop void CCActionManager::update(float dt) { 。。。。。 。。。。。 m_pCurrentTarget->currentAction->step(dt); 。。。。。 。。。。。 }
通过代码分析可以发现,ActionManager其实是在不停的在update方法中轮询的调用node的各个action的step方法,即cocos2dx里node的各种action都是在ActionManager中被轮询调用和执行。
CCActionManager代码还是比较多的,但是大都是细节处理代码,比如链表和数组的操作,以及为了防止特殊情况(动画的执行中有停止,移除自己的逻辑)下的数据异常,进行的规避代码等。去除了这些之后,整个流程就很简单了。
发表评论