场景的生命周期及回调方法

一、场景之间切换,一般由Director来操作,有两种方式:

1、push和pop压栈的形式,在A场景,push B场景,A场景还存在,只是显示的是B场景,然后pop回A场景,还是原来的那个A场景。这个跟应用开发里的navigationController的push和pop一样。

此外,压栈只能一层一层压,出栈可以多层出。

Director的push方法:

    void pushScene(Scene *scene);

Director的单层出栈方法:

    void popScene();

Director的返回根场景的方法:

    void popToRootScene();
Director的返回某个层级场景的方法:

    /** Pops out all scenes from the stack until it reaches `level`.
     If level is 0, it will end the director.
     If level is 1, it will pop all scenes until it reaches to root scene.
     If level is <= than the current stack level, it won't do anything.
     */
 	void popToSceneStackLevel(int level);

2、replace形式,在A场景replace B场景,这个时候A场景就销毁了,变成B场景,再replace A场景,这个时候A场景就是一个新的场景了。

Director的replace方法:

    void replaceScene(Scene *scene);

此外,导演类还有一个很常见的方法,第一次进入的场景,马上执行的:

    void runWithScene(Scene *scene);

二、场景切换时候的回调方法,场景的声明周期分单场景和多场景:

1、单场景的回调方法执行顺序如下:

    virtual bool init();

    virtual void onEnter();

    virtual void onEnterTransitionDidFinish();

2、初始化方法是重写父类的Layer的init方法。

多场景又根据场景的切换方式的不同,执行回调方法的顺序也有所不同,大致分三种:

1、A场景下,push B场景入栈:

B::init();
A::onExitTransitionDidStart();
B::onEnter();
A::onExit();
B::onExitTransitionDidFinish;

 2、A场景下,调用replace进入B场景: 

B::init();
A::onExitTransitionDidStart();
B::onEnter();
A::onExit();
B::onExitTransitionDidFinish;
A::cleanup();

跟第一种类似,但是多了一个A场景的cleanup操作,因为A场景已经准备被销毁掉了。

3、B场景下,pop回A场景:

B::onExitTransitionDidStart();
B::onExit();
B::cleanup();
A::onEnter();
A::onEnterTransitionDidFinish();

场景切换,主要要注意的就是执行顺序的问题,有可能导致画面还没出来,下一个场景的背景音乐就开始播放;或者是第二个场景的对象已经创建,第一个场景的对象还没释放,导致说一下子内存暴涨闪退的问题。这一块内容在后续文章中还会讨论,优化的问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值