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

来源:互联网 发布:b站视频下载 知乎 编辑:程序博客网 时间:2024/06/02 03:30

一、场景之间切换,一般由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
原创粉丝点击