码迷,mamicode.com
首页 > 其他好文 > 详细

cocos2dx action test

时间:2020-05-10 14:40:33      阅读:65      评论:0      收藏:0      [点我收藏+]

标签:对象   pca   The   引用计数   als   func   有用   没有   selectors   

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

标签:对象   pca   The   引用计数   als   func   有用   没有   selectors   

原文地址:https://www.cnblogs.com/czwlinux/p/12862942.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!