読者です 読者をやめる 読者になる 読者になる

< Cocos2d-x > シーン移動について

Cocos2d-x バージョン : v.3.x


Cocos2d-xのシーン移動はとても簡単で以下の通りです。

// Ver3.x.
Director::getInstance()->replaceScene(HelloWorld::createScene());


このシーンの移動時に特殊な演出をいれる時に使用するのが
Transitionクラスというものです。

以下のようなクラスが用意されています。

  • TransitionFade
  • TransitionFlipAngular
  • TransitionShrinkGrow
  • TransitionMoveInB
  • TransitionMoveInT
  • TransitionMoveInL
  • TransitionMoveInR
  • TransitionFadeTR
  • TransitionFadeUp
  • TransitionFlipX
  • TransitionFlipY
  • TransitionPageTurn
  • TransitionCrossFade


書き方としては以下のような形になります

// TransitionFadeの場合

// 引数1 --- フェードの時間
// 引数2 --- 移動シーン
// 引数3 --- フェードの色
Director::getInstance()->replaceScene(TransitionFade::create(1.0f, HelloWorld::createScene(), Color3B::WHITE));

ほかの使い方については調べるといっぱい出てきますので省略。


今回お話ししたいのはシーン移動時の処理の呼ばれるタイミングについてです。
シーン移動をした場合は以下のような処理が呼ばれます。

Scene1::Scene1
Scene1::init
Scene1::onEnter
Scene1::onEnterTransitionDidFinish

Scene2::Scene2
Scene2::init
Scene2::onEnter

Scene1::onExit
Scene2::onEnterTransitionDidFinish
Scene1::~Scene1

onEnter / onExit
--- シーンの切り替え時に必ず呼ばれる関数。

onEnterTransitionDidFinish
--- Transitionアニメーションが終了したタイミングで呼ばれる関数。
   (Transitionしていなくても呼ばれる)


このonEnterTransitionDidFinish関数で
replaceSceneなどを行うとフリーズするという問題が発生します。

対策としてはonEnterTransitionDidFinish関数ではディレイを入れて
最低1フレーム待機することでこの問題を解決することが出来ます。

試しにシーンに名前を付け、
下記のパターンのときのonEnterTransitionDidFinish関数内で
現在動作しているシーンを取得してみた結果以下のようになった。
シーン移動前のシーン名 : Scene1
シーン移動後のシーン名 : Scene2

1.通常のシーン移動(repreceScene)
 取得できたシーン名 : Scene2

2.Transitionを使用
 取得できない

3.Transitionを使用しディレイを入れる
 取得できたシーン名 : Scene2


デストラクタが関係してるのではないかと…思う。