加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

cocos2dx之onEnter,onExit

发布时间:2020-12-14 17:05:20 所属栏目:百科 来源:网络整理
导读:cocos2dx-3.0(24)onEnter()、onExit()、init()等场景生命周期函数介绍 层(Layer)的生命周期函数按如下的顺序进行: 1、init() 初始化层调用(在类初始化时,只会调用一次)。 2、onEnter() 进入层时候调用(init初始完后进入,可能调用多次,如addChild一次就会

cocos2dx-3.0(24)onEnter()、onExit()、init()等场景生命周期函数介绍


层(Layer)的生命周期函数按如下的顺序进行:


1、init() 初始化层调用(在类初始化时,只会调用一次)。

2、onEnter() 进入层时候调用(init初始完后进入,可能调用多次,如addChild一次就会调用一次)。

3、onEnterTransitionDidFinish() 进入层而且过渡动画结束时候调用(onEnter结束后进入)。

4、onExit() 退出层时候调用。

5、onExitTransitionDidStart() 退出层而且开始过渡动画时候调用(onExit结束后进入)。

6、cleanup() 层对象被清除时候调用(整个layer销毁时进入)。


引用stackoverflow上大神的一段话

"cocos2dx 类似于objective-c一样,有两种方式来申请内存、创建对象,一种是静态函数 creater,另一种是在他自己

的init里面,在这两函数里面申请内存、创建对象能让程序正常运行,但是当对象将到去展示或者或者被添加到另一个

容器中时,他会调用onEnter,也就是响应上面说的,最好不要在onEnter做内存方面的操作!"


我们去看看代码,来验证一下他们的执行顺序

头文件

[cpp] view plain copy
  1. voidonEnter();
  2. voidonExit();
  3. voidcleanup();
  4. voidonEnterTransitionDidFinish();
  5. voidonExitTransitionDidStart();


源文件里面

boolHelloWorld::init()
  • {
  • //////////////////////////////
  • //1.superinitfirst
  • if(!LayerColor::initWithColor(Color4B(120,120,255)))
  • {
  • returnfalse;
  • }
  • log("comeintohelloworldinit!!");
  • autovisibleSize=Director::getInstance()->getVisibleSize();
  • autoorigin=Director::getInstance()->getVisibleOrigin();
  • true;
  • }
  • voidHelloWorld::onEnter()
  • {
  • //原谅我用的是layerColor和layer一样的
  • LayerColor::onEnter();
  • log("comeintohelloworldonEnter!!");
  • voidHelloWorld::onEnterTransitionDidFinish()
  • LayerColor::onEnterTransitionDidFinish();
  • log("comeintohelloworldonEnterTransitionDidFinish!!");
  • }
  • voidHelloWorld::onExit()
  • LayerColor::onExit();
  • log("comeintohelloworldonExit!!");
  • }
  • 看下输出结果:





    这样他们的执行顺序就很明显了



    注意这些函数在执行自己的代码之前都必须先执行父类的动作,因为在执行addChild操作时,会调用每个子节点的onEnter与

    onExit,进入与退出父类的节点。去看源码,会发现create()函数里面先会调用init()然后在去调用onEnter,addChild里面

    也是这样的。所以总结一点,可以在onEnter里面触发一此操作,但最好不要在里面申请内存或addChild之类的操。

    大家去看cpp-tests会发现几乎全用的onEnter,直接使用new Objectxxx()之类的操作来生成对象,直接使用new 这样的操作,

    就会进入onEnter里面,如果使用 create之类的,就会先进入init在进入onEnter,这两种方式的好与坏,相信大家一目了然,

    直接使用构造函数是无法确实是否成功,因为构造函数不会返回值,如果使用 init 就能自己定义返回值,并且还能添加很多

    操作,封装在函数里面,让我们看到接口非常干净。之所以cpp-test里面全是直接onEnter有可能是因为2.x版本时候写的,作

    者懒得去更改了,2.x确实很提倡使用onEnter。

    (编辑:李大同)

    【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

      推荐文章
        热点阅读