蓮賀まさとき さんが書きました:上手く行く場合とエラー( Type Error Cannot read property
'forEach' of undefined )になってしまう場合が出て来てしまいました。
forEachが無い…これはアレですかね。
実は微妙に気になったので
@textから
this._textsに変更してるんですけど
その辺に気付かず混在しているとthis._text.forEachとか書いて同様のエラーが起こる可能性がありますね。
それと新規ウィンドウの用途が分からないのであまり込み入った事は書けなかったのですが
簡単な例文を書くならこうなりますかね…マップ画面に適当なウィンドウを表示するプラグインです。
class構文を使うか迷ったのですけどこちらの方がRubyに近いので
コアスクリプトの書き方とは異なりますがこういう書き方もありますよ、という事で。
新規のクラスを作る場合はこちらの方が捗ります。
一度コツを掴めば後は反復作業だと思うんですけどそこまでのハードルが少し高いかもしれませんね。
コード: 全て選択
(() => {
'use strict'
class Window_Test extends Window_Base {
constructor() {
super(...arguments);
}
initialize(x, y, width, height) {
super.initialize(x, y, width, height);
this.refresh();
}
refresh() {
this.contents.clear();
this._texts = [
"テキスト テキスト テキスト",
"テキスト テキスト",
"テキスト テキスト",
" ",
"テキスト テキスト テキスト",
"テキスト テキスト",
"テキスト テキスト テキスト",
"テキスト",
];
this._texts.forEach((text, i) => {
const x = 0;
const y = 0 + i * this.lineHeight();
this.drawText(text, x, y, this.contents.width, 'left');
});
}
}
const _Scene_Map_createAllWindows = Scene_Map.prototype.createAllWindows;
Scene_Map.prototype.createAllWindows = function() {
_Scene_Map_createAllWindows.apply(this, arguments);
this.createTestWindow();
};
Scene_Map.prototype.createTestWindow = function() {
this._testWindow = new Window_Test(0, 0, Graphics.boxWidth / 2, Graphics.boxHeight);
this.addChild(this._testWindow);
};
})();
・class Window_Test extends Window_Base
Rubyのclass Window_Test < Window_Baseと同じ。継承を意味します。
・constructor(){}
Rubyで言う所のdef initialize。オブジェクトの生成と共に呼び出される特殊なメソッド。
後述のinitializeはただのメソッドでWindow_Baseのconstructor内で呼び出しているだけなので混同に注意。
親クラスのコンストラクタを呼び出す場合はsuper()で呼び出す。
...argumentsとは与えられた引数をそのまま引き渡す、という意味です。
・super.initialize(x, y, width, height);
親クラス(Window_Base)のinitializeを使うという意味。
コンストラクタやRubyのsuperとは違って逐一、メソッドまで指定する必要があります。
・ const _Scene_Map_createAllWindows = Scene_Map.prototype.createAllWindows;
Rubyのaliasと同じ。既存の処理を退避しています。
・_Scene_Map_createAllWindows.apply(this, arguments);
退避させたメソッドの使用。callとapplyの二種類がありますが
.apply(this, arguments);と書いておけば引数に関係無く元メソッドに処理を渡す事が出来ます。
・new Window_Test(0, 0, Graphics.boxWidth / 2, Graphics.boxHeight);
オブジェクトの作成。Rubyでいうところの.newから変形しています。
ここでは適当にWindowの幅高さに画面の横幅の半分と画面の縦幅を指定しています。
・this.addChild(this._testWindow);
Scene_Mapオブジェクトに作成したWindow_Testオブジェクトを関連付けます。
ここで初めてWindowは有効化されます。