您的位置:首页 > Web前端 > Node.js

Node::onEnter方法讲解

2016-07-11 18:55 363 查看
今天遇到一个问题,自己封装了一个精灵(继承了精灵类和目标代理),里边实现了一个动画效果,但是调用的时候却没有动画,只是静态的图片。和同事们反复研究后发现原来是在重写的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;

这是一个非常好的标志用来判断
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: