出しゃばらなくてもいいかな、と思いつつ
自分の言葉で整理してみたくもあったので挑戦してみます。
まず…
Spriteset_Battle クラスのインスタンスを this にする
とは言われていないと思います。
this の中身を好き勝手に設定できるという話ではなく
this は書く場所によって中身が変わるということを理解しよう、というお話でしょう。
Spriteset_Battle の中で this と書かれていればそれは Spriteset_Battle のインスタンスです。
だから Spriteset_Battle の中に限っては this.battleback1Name() と書ける。
Spriteset_Battle の適当な必ず呼ばれるメソッド…とりあえず createBattleback() に処理を追加して
ゲーム変数に戦闘背景のファイル名を取得する場合
(create... なのに名前取得処理を追加するセンスはおいといて)
コード: 全て選択
const _Spriteset_Battle_createBattleback = Spriteset_Battle.prototype.createBattleback;
Spriteset_Battle.prototype.createBattleback = function() {
_Spriteset_Battle_createBattleback.call(this);
$gameVariables.setValue(1, this.battleback1Name()); // 戦闘背景1のファイル名を変数1に取得
$gameVariables.setValue(2, this.battleback2Name()); // 戦闘背景2のファイル名を変数2に取得
};
こんな風に出来るかと思います。これもひとつの手段です。
が、別の方法も考えられます。Scene_Battle の処理でやる場合。
Scene_Battle の中で this とあればそれは Scene_Battle のインスタンスです。
Spriteset_Battle のインスタンスではないので、this.battleback1Name() とは書けません。
ではどうするかというと
Scene_Battle の中で Spriteset_Battle のインスタンスを作成している箇所があるのでそれを探します。
コード: 全て選択
Scene_Battle.prototype.createSpriteset = function() {
this._spriteset = new Spriteset_Battle();
this.addChild(this._spriteset);
};
これです。
Spriteset_Battle のインスタンスを new で作成し、this._spriteset という名前で保持しています。
したがって Scene_Battle の中に書くなら
this.battleback1Name() ではなく
this._spriteset.battleback1Name() になります。
最初の例と同じく
Scene_Battle の適当なメソッド…とりあえず createSpriteset() に処理を追加
(create... なのに())
コード: 全て選択
const _Scene_Battle_createSpriteset = Scene_Battle.prototype.createSpriteset;
Scene_Battle.prototype.createSpriteset = function() {
_Scene_Battle_createSpriteset.call(this);
$gameVariables.setValue(1, this._spriteset.battleback1Name()); // 戦闘背景1のファイル名を変数1に取得
$gameVariables.setValue(2, this._spriteset.battleback2Name()); // 戦闘背景2のファイル名を変数2に取得
};
これでも出来るでしょう。
ではイベントコマンドのスクリプトやコンソールに直に書く場合はどうか。
イベントコマンドのスクリプトにおける this と
デバッグコンソールにおける this もまた別物なんですけど
めんどくさいのでおいといて
Scene_Battle が Spriteset_Battle のインスタンスを持っていることは前述のとおりですので
Scene_Battle のインスタンスを見つけられれば解決しそうです。
Scene_Battle._spriteset と書きたいところですが
シーンの外からシーンのインスタンスを直接参照することはできないらしいので
SceneManager を通して現在のシーンを参照します。
コード: 全て選択
SceneManager._scene; // 現在のシーンのインスタンス(戦闘中なら Scene_Battle)
SceneManager._scene._spriteset; // Scene_Battle がもつ Spriteset_Battle のインスタンス
SceneManager._scene._spriteset.battleback1Name(); // 戦闘背景1のファイル名
Scene_Battle の中に書いた this._spriteset と
戦闘中に SceneManager._scene._spriteset で参照できるものは同一だというお話でした。
言葉で説明するのはなかなか難儀ですね…
余計にややこしくなったカモシレナーイ