当前位置: 代码迷 >> 综合 >> cocos2dx :多场景切换过程中的生命周期变化
  详细解决方案

cocos2dx :多场景切换过程中的生命周期变化

热度:61   发布时间:2023-10-30 19:55:13.0

当我们通过导演来切换场景时,切换场景的方法不同,会导致场景中的层之间的一些初始化方法被调用的顺序不同.

通过上一篇博客的导演类的常用函数方法我们可以知道,导演有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 init
FirstLayer onExitTransitionDidStart!
FirstLayer onExit
SecondLayer onEnter!
SecondLayer onEnterTransitionDidFinish!

二.通过popScene()方法从SecondScene返回FirstScene的调用顺序如下:

先把第二个场景给退出,然后内存给释放,最后才进入第一个场景的进入函数,则不会在进入第一个场景的init()函数了,所以init()函数只被调用一次.
SecondLayer onExitTransitionDidStart!
SecondLayer onExit
SecondLayer cleanup!
FirstScene onEnter!
FirstScene onEnterTransitionDidFinish!

三.通过replaceScene()方法从FirstScene进入到SecondScene.

我们可以观察到都是先调用下一个场景的初始化init()函数,然后在调用之前场景的退出函数.
SecondLayer init
FirstLayer onExitTransitionDidStart!
FirstLayer onExit
FirstLayer cleanup!
SecondLayer onEnter!
SecondLayer onEnterTransitionDidFinish!

通过几次测试,我们知道了不同的切换场景的方法,其中场景的方法调用顺序是不同的,但是有一点是可以确定的,那就是下一个场景的init()函数会被优先调用,且用replaceScene()的话,新场景每被调用一次,则init()被调用一次,但用pushScene()和popScene()组合方法时,init()只会被调用一次..除非被cleanup释放…