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