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;
这是一个非常好的标志用来判断
相关文章推荐
- express 4.0 新属性
- 用NodeJs做一个小爬虫
- 那些年用node接入微信走过的坑之(三)---微信事件监听
- 那些年用node接入微信走过的坑之(二)---微信自定义菜单
- 用node.js 搭建的博客程序心得(node.js实战读书笔记1)
- LeetCode 237. Delete Node in a Linked List
- Node.SelectNodes
- jquery-ui.min.js:5 Uncaught TypeError: b.nodeName.toLowerCase is not a function
- namenode不存在
- nodejs使用nodejs创建简单的静态文件服务器
- 一行命令搞定node.js 版本升级
- nodejs 安装没有找到 configure
- co与generator
- node.js利用gulp 启动webServer服务
- nodejs 工具
- NodeJs:module.filename、__filename、__dirname、process.cwd()和require.main.filename 解惑
- hadoop datanode 磁盘数据平衡
- Hadoop DataNode 增加磁盘
- nodejs入门之使用nodejs展示一个网页
- Hadoop datanode Datanode denied communication with namenode错误及解决