フェードアウト、インで切り替えようとしたところ途中で一瞬全部表示されるという妙な挙動となる。
js版だけでなくどうもcocos2dのクセらしい。
古い情報だが Objective-C 版での事例を参考に対応。参考にしたのは次のページ
Cocos2D iPhone - removing the black screen between CCTransition
エンジンのソースを追いかけたわけでは無いので本当の理由は不明。
ただ遷移後のシーンで開始直後に Menu を用意するケースで発生する模様。(前述の参考リンクでもそれらしきことが書かれている)
今回は cc.Transition??? を使わずに対応した。
cc.Transition??? を使用してシーン遷移を行う(2015/04/15修正)
コードはだいたい次の通り(実際のコードは少々面倒なので説明のための書き方としている)
checkGameOver: function() {
if (ゲームーオーバーであれば) {
this.scheduleOnce(this.onGameOver, 1, "toGameOver");
}
},
onGameOver: function () {
cc.LoaderScene.preload(g_gameover_resources, function () {
cc.audioEngine.stopMusic();
cc.audioEngine.stopAllEffects();
var scene = new cc.Scene();
var layer = new GameOverLayer();
scene.addChild(layer);
cc.director.runScene(new cc.TransitionFade(1.2, scene));
}, this);
},
init: function(score){
this._super();
gFadeInMask = new cc.LayerColor(cc.color(0,0,0,255), SCREEN_WIDTH, SCREEN_HEIGHT);
this.addChild(gFadeInMask, 500);
gGameOverLayer = this;
},
onEnter: function() {
this._super();
var action = cc.fadeTo(0.6, 0);
gFadeInMask.runAction(cc.sequence([action, cc.callFunc(function() {
gFadeInMask.removeFromParent(true);
}, gGameOverLayer)]));
},
参考リンクでの対応事例と違って遷移前のレイヤーでもマスクを用意してフェードアウトを行っている。
自分のやり方が悪いのかcocosのバージョンが違うためなのかは不明だが、同じアプローチではちらつきを解消できなかったため。
(参考リンクでの対応事例は runScene() を呼び出す際に Transition を使用してフェードインアウトを実現しているためもう少しシンプルな記述)
フェードはこれでよいが他のtransitionではどうしたものか。
2014/04/15
cc.Transition??? を使うスタイルへ修正できた。
実に単純な話で遷移前のレイヤーで update メソッド内から普通の関数コールの形で onGameOver() を呼び出していたのが問題だった。
scheduleOnce() を使用してタスクを遅延実行する形を取ったところ組込み Transition を使うスタイルを無事実現できた。