【MV】現在のシーンを取得する

ツクールMVでゲームを作っていると、現在のシーンを取得したくなることってありませんか?
もうちょっと進んで、現在のシーンがAというシーンであるかどうかを知りたいときってありませんか?
僕はちょいちょいあります。
というわけで、今回はシーン取得のアレコレについて調べたので、それをまとめておきたいと思います。

注*内容に間違いがあるかもしれません。

現在のシーンの取得方法

現在のシーンの取得方法はシンプルです。

SceneManager._scene

たったこれで現在のシーンが取得できます(正確な話をすると、現在のシーンのインスタンスへの参照がこのプロパティに保持されています。たぶん)。
で、これ使ってどうすんねんっちゅー話ですね。

現在のシーンがマップかどうかを判定したい

例えば現在のシーンがマップかどうかを判定したいとします。
どうやって判定しましょう?
答えを先に書くと、こうです。

SceneManager._scene.constructor === Scene_Map

これで、もし現在のシーンがScene_Mapならtrueが返ります。
違うシーンならfalseです。

NG例

NG例も紹介します。
まずこれ。

SceneManager._scene === Scene_Map

どのシーンにいてもfalseしか返ってきません。

次にこれ。

SceneManager._scene instanceof Scene_Map

マップシーンにいるならtrueが返ってきます。
一見するとうまくいっているように思いますが、これも実はあんまりよくないです。

理由は

SceneManager._scene instanceof Scene_Base

これでもtrueが返ってくるからです。
要は継承関係にあると、それも真であるとみなされるのですね。

例えば

console.log(SceneManager._scene instanceof Stage);
console.log(SceneManager._scene instanceof PIXI.Container);
console.log(SceneManager._scene instanceof Object);

どのシーンにいても、これ全部trueが返ってきます。

逆にこっちなら全部falseが返ってきます。

console.log(SceneManager._scene.constructor === Stage);
console.log(SceneManager._scene.constructor === PIXI.Container);
console.log(SceneManager._scene.constructor === Object);

instanceof演算子はプロトタイプチェーンを辿っていくけれど、constructorプロパティでの比較はコンストラクタ関数のみをチェックする、と覚えておくとよいかもしれませんね。
「そんな難しい話どうでもええんじゃ」って方は、とりあえず「SceneManager._scene.constructor」で比較しといてください。

ただJavaScriptはプロトタイプチェーンをぶった切ったり、コンストラクタ関数を変えたりできるみたいなので、プラグインの作り方によってはシーンの判定に使えないかもしれません……。
が、コアスクリプトを踏襲しているプラグインならきっと大丈夫です。
知らんけど大丈夫ですきっとたぶんおそらく。

ほな、こんなところで。

フォローする