标签:对象 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的对象。
标签:对象 pca The 引用计数 als func 有用 没有 selectors
原文地址:https://www.cnblogs.com/czwlinux/p/12862942.html