LoginSignup
2
2

More than 5 years have passed since last update.

SceneのinitでreplaceSceneすると解放されてしまう問題とその対策

Posted at

表題の通りです。

  • 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を噛ませておいた方が良いのかも知れませんね。

2
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2