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

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

通过上一篇博客的导演类的常用函数方法我们可以知道,导演有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释放…

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值