SRC遊んだり書いたり。時々プログラミング

SRCの感想とか技術解説とか、そんな感じのアレ!

enchant.jsで任意のシーンを最前面に表示する関数と解説

明けましておめでとうございます

今年はじめての更新となりました。本年も、どうぞよろしくお願いします。

jsdo.itにスクリプトを投稿

次のスクリプトを投稿しました。

少し技術的な解説をします。

解説

配列のコピー

実装
//配列をコピー
Array.prototype.clone = function(){
    var arr = new Array();//新しい配列
    for( var i = 0; i< this.length; i++ )
        arr[i] = this[i];//コピー
    return arr;
}
利用方法
var hoge = 配列名.clone();

関数内で新しく配列を作成し、コピー元の配列の要素をすべてコピーしています。

シーンを最前面に移動する

実装
//シーンを手前に表示する
Game.prototype.forwardScene = function( scene ){
    var beforeScenes = Game.instance._scenes.clone();//変更前のシーンスタックをコピー
    while( this.currentScene != this.rootScene )//rootScene以外の
        this.popScene();//シーンをすべてスタックから取り出す
    for( var i = 0; i < beforeScenes.length; i++ )
        if( beforeScenes[i] != scene &&
        	beforeScenes[i] != this.rootScene )//手前に表示したいシーン以外を
            this.pushScene( beforeScenes[i] );//元通りスタックに入れていく
    this.pushScene( scene );//最後に手前に表示したいシーンをスタックに入れる
    return;
}
利用方法
hogame.forwardScene(hogescene);

Game.instance._scenesはシーンのスタックになる配列です。

  1. Game.instance._scenesをコピー
  2. 全てのシーンをスタックから取り出し
  3. 最前面に表示するシーンとrootScene以外をスタックに入れ
  4. 最後に最前面に表示したいシーンをスタックに入れる

という手順でシーンの移動を行なっています。

ポップしていないシーンは絶対にプッシュしない

例えばRPGなどのゲームでメニュー画面のシーンを表示したあと、メニューを閉じる際にpopSceneを行わずに移動画面などのシーンをpushSceneで呼び出すと、不具合の原因になったりします。
上記にもありますが、スタックにあるシーンをpushSceneする事は避けましょう。