cocos2dx :多场景切换过程中的生命周期变化
来源:互联网 发布:崩坏学园漫画淘宝 编辑:程序博客网 时间:2024/06/01 09:01
当我们通过导演来切换场景时,切换场景的方法不同,会导致场景中的层之间的一些初始化方法被调用的顺序不同.
通过上一篇博客的导演类的常用函数方法我们可以知道,导演有3种方法来切换场景:
0.void runWithScene(Scene *scene); //此方法作为运行的第一个场景,调用顺序即第一个场景的
1.void replaceScene(Scene *scene); //直接替换场景,释放当前场景.
2.void pushScene(Scene *scene); //把下一个场景加入到场景调度器中.当前场景不被释放.
3.void popScene(); //释放当前场景,切换到上一个场景.
层共有五个声明周期,在各自的声明周期调用了各自的函数方法,这五个函数方法也作为虚函数,继承了下来.可以自定义层来重写这些虚函数来使用.
0.bool init(); //初始化层的时候调用.
1. void onEnter(); //进入层的时候调用.
2. void onEnterTransitionDidFinish();//进入层且切换动画播放完之后调用.
3. void onExitTransitionDidStart(); //离开层且切换动画播放时调用.
4. void onExit(); //退出层的时候调用.
5. void cleanup(); //清除层的时候调用.
我们定义两个层,分别作为两个场景,然后用导演去运行,然后用不同的方法去切换场景,看看调用函数的顺序.
一.通过pushScene 从FirstScene切换到SecondScene:
我们右键查看create()的实现:我们知道了原来Node::create()来创建对象时,是先调用了类的构造函数,在调用bool init()初始化函数的.
//首先new一个对象. __TYPE__ *pRet = new(std::nothrow) __TYPE__(); //然后判断是否成功和初始化成功,如果成功则加入缓冲池. if (pRet && pRet->init()) { pRet->autorelease(); return pRet; } else { //否则释放掉. delete pRet; pRet = nullptr; return nullptr; }
void FirstLayer::onEnter(){ Layer::onEnter(); log("FirstLayer onEnter!");}void FirstLayer::onEnterTransitionDidFinish(){ Layer::onEnterTransitionDidFinish(); log("FirstLayer onEnterTransitionDidFinish!");}void FirstLayer::onExitTransitionDidStart(){ Layer::onExitTransitionDidStart(); log("FirstLayer onExitTransitionDidStart!");}void FirstLayer::onExit(){ Layer::onExit(); log("FirstLayer onExit");}void FirstLayer::cleanup(){ Layer::cleanup(); log("FirstLayer cleanup!");}
一.通过pushScene()方法从FirstScene进入SecondScene的调用顺序如下:
//这里为日志输出的结果,我们观察到:先调用第二个场景的初始化函数,然后在调用第一个场景的退出函数.最后在进入第二个场景的进入函数.
SecondLayer initFirstLayer onExitTransitionDidStart!FirstLayer onExitSecondLayer onEnter!SecondLayer onEnterTransitionDidFinish!
二.通过popScene()方法从SecondScene返回FirstScene的调用顺序如下:
先把第二个场景给退出,然后内存给释放,最后才进入第一个场景的进入函数,则不会在进入第一个场景的init()函数了,所以init()函数只被调用一次.SecondLayer onExitTransitionDidStart!SecondLayer onExitSecondLayer cleanup!FirstScene onEnter!FirstScene onEnterTransitionDidFinish!
三.通过replaceScene()方法从FirstScene进入到SecondScene.
我们可以观察到都是先调用下一个场景的初始化init()函数,然后在调用之前场景的退出函数.SecondLayer initFirstLayer onExitTransitionDidStart!FirstLayer onExitFirstLayer cleanup!SecondLayer onEnter!SecondLayer onEnterTransitionDidFinish!
通过几次测试,我们知道了不同的切换场景的方法,其中场景的方法调用顺序是不同的,但是有一点是可以确定的,那就是下一个场景的init()函数会被优先调用,且用replaceScene()的话,新场景每被调用一次,则init()被调用一次,但用pushScene()和popScene()组合方法时,init()只会被调用一次..除非被cleanup释放…
- cocos2dx :多场景切换过程中的生命周期变化
- cocos2dx场景切换动画
- cocos2dx场景切换动画
- cocos2dx 场景切换动画
- cocos2dx之场景切换
- --cocos2dx场景切换--
- cocos2dx切换场景
- Cocos2dx 场景自动切换
- COCOS2DX场景切换特效
- cocos2dx 场景切换特效
- cocos2dx场景切换动画
- cocos2dx 场景切换顺序
- cocos2dx单场景和多场景的生命周期
- cocos2dx单场景和多场景的生命周期
- Cocos2d-x多场景切换生命周期
- Cocos2d-x多场景切换生命周期
- Cocos2d-x多场景切换生命周期
- cocos2dx 场景切换动画效果
- [后缀数组] BZOJ4650: [Noi2016] 优秀的拆分
- Android 封装工具类之文件缓存
- 字符编码简介:ASCII,Unicode,UTF-8,GB2312及Unicode和UTF-8如何转化
- TortoiseSVN报错:“Previous operation has not finished; run 'clean up' if it was interrupted“ 的解决方法
- 欧几里得算法求解乘法逆元——Python
- cocos2dx :多场景切换过程中的生命周期变化
- JavaScript更新日志(5)
- springboot+Rabit实战二:(Rabbit MQ web 界面管理)
- java--集合案例
- UCOS_II学习笔记---信号量管理之信号量的使用
- 用c#批量新建空的文件夹
- 实用网站记录(持续更新中...)
- Unity3D Note
- java对象池commons-pool-1.6详解(一)