好记性不如铅笔头

C && C++, cocos2dx, 编程

cocos2dx学习笔记:ActionManager

最近学习了下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代码还是比较多的,但是大都是细节处理代码,比如链表和数组的操作,以及为了防止特殊情况(动画的执行中有停止,移除自己的逻辑)下的数据异常,进行的规避代码等。去除了这些之后,整个流程就很简单了。

发表评论

19 − 14 =

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据