Node::onEnter方法讲解

来源:互联网 发布:c语言自学需要什么软件 编辑:程序博客网 时间:2024/05/13 21:32
今天遇到一个问题,自己封装了一个精灵(继承了精灵类和目标代理),里边实现了一个动画效果,但是调用的时候却没有动画,只是静态的图片。和同事们反复研究后发现原来是在重写的onEnter中忘记了调用CCSprite::onEnter(),这是很多童鞋们容易忽略的问题,在重写cocos2d-x组件的时候,总是忘了调用一下要重写组件的方法,亲们一定要注意了哦。现在详细分析一下onEnter()这个方法。CCSprite直接调用了CCNode的onEnter(),由于CCLayer需要进行触屏事件的处理,所以重写了一下,处理了触屏事件,但是最终还是调用了CCNode::onEnter();最终问题都归结于CCNode::onEnter()大家先看下CCNode源码:void CCNode::onEnter(){arrayMakeObjectsPerformSelector(m_pChildren, &CCNode::onEnter);this->resumeSchedulerAndActions();m_bIsRunning = true;}void CCNode::onEnterTransitionDidFinish(){arrayMakeObjectsPerformSelector(m_pChildren, &CCNode::onEnterTransitionDidFinish);}void CCNode::onExit(){this->pauseSchedulerAndActions();m_bIsRunning = false;arrayMakeObjectsPerformSelector(m_pChildren, &CCNode::onExit);}arrayMakeObjectsPerformSelector方法如下:void CCNode::arrayMakeObjectsPerformSelector(CCArray* pArray, callbackFunc func){if(pArray && pArray->count() > 0){CCObject* child;CCARRAY_FOREACH(pArray, child){CCNode* pNode = (CCNode*) child;if(pNode && (0 != func)){(pNode->*func)();}}}}

更进一步:

比如子弹的问题,当超过屏幕我们就从layer中 removeChild 将这个子弹移除掉。那么,是否有状态来判断这个子弹是否已经被移除了呢?

那就是通过 isRunning函数来判断,如果这个子弹还在layer中 那么isRunning返回true;如果调用了 layer->removeChild 那么isRunning则返回false;
那么 isRunning这个函数的状态是什么时候被设置的呢?
当调用CCLayer->addChild的时候 会调用CCNode.onEnter 在这里面会设置isRunning;
当调用CCLayer->removeChild的时候 会调用CCNode.onExit 在这里会重新清理isRunning;
这是一个非常好的标志用来判断




0 0