表題の通りです。
- GatewayScene
- MainScene
ある条件を満たしたときに、GatewaySceneからMainSceneへ遷移したいということがあると思います。
ここで以下のようなコードを書いてしまうと思ったような結果が出ません。
bool GatewayScene::init()
{
if ( !Layer::init() ) {
return false;
}
auto mainScene = MainScene::createScene();
Director::getInstance()->replaceScene( mainScene );
return true;
}
// AppDelegateなどで以下のようにしている想定です
{
auto scene = GatewayScene::createScene();
Director::getInstance()->runWithScene(scene);
}
これは、Directorのインスタンスが持っている_sceneStackにGatewaySceneのインスタンスをpushBackするより先にMainSceneをpushBackしちゃうのが原因です。
以下の様にするとこの問題がなくなります。
bool GatewayScene::init()
{
if ( !Layer::init() ) {
return false;
}
this->runAction( CallFunc::create([](){
auto mainScene = MainScene::createScene();
Director::getInstance()->replaceScene( mainScene );
});
return true;
}
runActionの中で実行すると、ループの次の周回で処理が行われるのですね。
これに限らず、画面の構築以外の処理はinitでやらず、一回runActionを噛ませておいた方が良いのかも知れませんね。