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释放…

原创粉丝点击