cocos2dx action test

Posted czwlinux

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cocos2dx action test相关的知识,希望对你有一定的参考价值。

1、CCToggleVisibility对当前的action动作的精灵对象进行取反的visible设置

    CCActionInterval*  move1 = CCMoveBy::create(1, ccp(250,0));
    CCActionInterval*  move2 = CCMoveBy::create(1, ccp(0,50));
    CCToggleVisibility*  tog1 = new CCToggleVisibility();
    CCToggleVisibility*  tog2 = new CCToggleVisibility();
    tog1->autorelease();
    tog2->autorelease();
    CCFiniteTimeAction*  seq = CCSequence::create( move1, tog1, move2, tog2, move1->reverse(), NULL);
    m_kathia->runAction(seq);

如上显示的动作将会是move1执行1秒然后tog1隐藏,因为当前是隐藏状态所以move2的动作将会处于隐藏状态的执行,当执行到tog2的时候将move2之后的位置显示出来因为之前是隐藏状态所以现在转成显示的,然后再执行move1->reverse()

具体CCToggleVisibility的执行原理可以看他源代码的update函数

void CCToggleVisibility::update(float time) 
{
    m_pTarget->setVisible(!m_pTarget->isVisible());
}

当action执行到CCToggleVisibility的时候,只做一个动作就是取反设置该执行精灵的visible

 

2、removeFromParentAndCleanup 从父节点移除自己,后面的bCleanUp是判断是否移除action

当调用该函数的时候,不管bCleanUp是true还是false都会从父节点中移除自己(引用计数减1);当bCleanUp为true的时候则删除之前回去调用自身拥有的action的release;如果没有调用true会产生本身移除了,但是action对象没有被删除的情况。

这种情况只有用在你想保留该节点的action留作他用。使用时候需要很注意。具体调用的源码如下所示

void CCNode::detachChild(CCNode *child, bool doCleanup)
{
    // IMPORTANT:
    //  -1st do onExit
    //  -2nd cleanup
    if (m_bRunning)
    {
        child->onExitTransitionDidStart();
        child->onExit();
    }
    // If you don‘t do cleanup, the child‘s actions will not get removed and the
    // its scheduledSelectors_ dict will not get released!
    if (doCleanup)
    {
        child->cleanup();
    }
    // set parent nil at the end
    child->setParent(NULL);
    m_pChildren->removeObject(child);
}

如上先判断是否是在running;因为调用一个节点的显示的时候,调用顺序是这样子的:

m_pRunningScene->onEnter();
m_pRunningScene->onEnterTransitionDidFinish();

所以当要停止调用的时候需要反过来停止。

然后判断是否cleanup再移除本身的节点。

如果只是想从父节点移除,放置到另一个父节点则不能调用removeFromParentAndCleanup;需要使用

m_grossini->retain();
m_grossini->removeFromParentAndCleanup(false);

3、CCCallFuncN继承action,对应的回调函数有一个node参数

构造的时候类似于这样子:CCCallFuncN::create( this, callfuncN_selector(ActionRepeatForever::repeatForever) ),即this中有一个repeatForever的函数当调用该action的时候会去调用该函数,并传入谁执行这个action的哪个node

void ActionRepeatForever::repeatForever(CCNode* pSender)
{
    CCRepeatForever *repeat = CCRepeatForever::create( CCRotateBy::create(1.0f, 360) );

    pSender->runAction(repeat);
}

如上,则可以在psender添加对应的action;

执行顺序:m_grossini->runAction(action); 会调用CCCallFunc的update函数,然后update会调用this->execute();因为execute是虚函数,在CCCallFuncN中有对应的实现,所以会调用CCCallFuncN的execute函数,如下所示

void CCCallFuncN::execute() {
    if (m_pCallFuncN) {
        (m_pSelectorTarget->*m_pCallFuncN)(m_pTarget);
    }
。。。
}

m_pTarget就是调用执行该actionfunc的对象。

 

以上是关于cocos2dx action test的主要内容,如果未能解决你的问题,请参考以下文章

cocos2dx Action动作解析

Xcode 运行cocos2dx弹出内部错误对话框

cocos2dx帧动画如何组合

cocos2dx 自己主动绑定js

[React Testing] Use Generated Data in Tests with tests-data-bot to Improve Test Maintainability(代码片段

cocos2dx 3.x(常见的46种动作)