RPGツクールMVのプラグイン開発で自作ウィンドウを作って、オリジナリティのある画面にしたいということもあります。
自作の画面を作るときは、シーンとウィンドウを自作してあげる必要があるんですが、今回は自作ウィンドウ開発の話になります。
僕はツクールMVの自作ウィンドウ開発をするときのTipsをまとめてみたいと思います。
Window_SelectableクラスのTips
まずは、よく使うWindow_Selectableクラスに関するTipsを紹介します。
Window_Selectableクラスはアイテムウィンドウのような項目を選択するウィンドウ作成で必須になるクラスです。
maxItems関数を必ず上書きする
maxItems関数は項目の最大数を返す関数なんですが、Window_Selectableクラスの中では0を返すようになっています。
これを上書きしないと、項目が0個ということになってしまい、せっかく自作ウィンドウを作っても何も表示されなくなります。
maxItems関数の上書きについては、いろいろな書き方がありますが、最大項目数を返すのが普通なので、以下のように書くことが多いと思います。
MyWindow.prototype.maxItems = function() {
return this._list ? this._list.length : 0;
};
this._listは項目を入れる配列です。これの長さを返すことで、項目数を返すことになります。
ちなみに、this._list配列の中身は自分で設定する必要があります。
maxCols関数で列数変更
maxCols関数は、表示する列の数です。Window_Selectableクラスの中では1を返すようになっています。
なので、列数が1なら変更する必要はありません。
逆に2列のウィンドウにしたいなら、上書きする必要があります。
以下は2列のウィンドウのmaxCols関数の例です。
MyWindow.prototype.maxCols = function() {
return 2;
};
この関数の上書きはわかりやすいと思います。
maxPageRows関数で表示行数変更
maxPageRows関数は、ウィンドウに表示する最大の行数を返します。
これは上書きしなくてもよいケースも多いんですが、項目を表示する範囲を絞りたいときに使います。
Window_Selectableクラスではウィンドウの中全てを使って行を表示するようになっているので、表示する行数を変えたいときはmaxPageRows関数を上書きする必要があります。
例えば、一度に表示する行の数を5行にしたいときは以下のようにします。
MyWindow.prototype.maxPageRows = function() {
return 5;
};
こうすることで、ウィンドウに表示される行数は5行になります。
ちょっとわかりにくいかもしれないので、上書きの前後でウィンドウを見比べてみます。

これはメニューのウィンドウです。左がデフォルトで右がmaxPageRows関数で5を返すようにしたものです。
5行表示されるようになっているのがわかります。
itemRect関数で項目の領域計算
itemRect関数はとても重要です。この関数は項目の領域を計算しています。そして、項目の領域をRectangleオブジェクトとして返します。
Rectangleオブジェクトにはx、y、width、heightというプロパティはあり、それぞれx座標、y座標、幅、高さになっています。
itemRect関数で得られた項目の座標と大きさは、カーソルの描画に使われたりします。
例えば、
- x:10
- y:10
- width:100
- height:20
なら、(10、10)の座標に幅100で高さ20のカーソルが表示されます。
また、itemRect関数は項目を描画するdrawItem関数でも使われることが多いです。
項目とカーソルの描画は揃える必要があるので、描画領域の計算はitemRect関数で行うべきです。
select関数は項目を移動するときに呼ぶ
select関数はカーソルやマウスで項目を移動するときに呼ばれます。カーソルを移動しただけで呼ばれますので注意が必要です。
select関数は基本的に上書きすることは少ないのですが、カーソルを移動したタイミングでウィンドウを再描画したいときなどは、この関数の中でrefresh関数を呼んであげましょう。
以下はサンプルです。
MyWindow.prototype.select = function(index) {
Window_Selectable.prototype.select.call(this, index);
this.refresh();
};
このコードでは、Window_Selectableクラスのselect関数を呼んでから、refresh関数を呼んでいます。
こうすることで、カーソルを移動するたびにウィンドウが再描画されます。
isCurrentItemEnabled関数で項目の使用可否を判定
isCurrentItemEnabled関数はok処理(Zキーや項目のクリック)で呼ばれる関数で、対象の項目が使用できるかどうかを判定します。
例えば、MPが足りない状態でスキルを選択したりすると、この関数はfalseを返すといった感じです。
isCurrentItemEnabled関数はWindow_Selectableクラスのok処理で呼ばれていますが、関数自体は定義されていないので、継承した先のクラスで定義する必要があります。
また、この関数とは別に項目の使用可否を判定するisEnabled関数を作って、isCurrentItemEnabled関数の中でisEnabled関数を呼ぶというやり方もよく使われます。
MyWindow.prototype.isCurrentItemEnabled = function() {
return this.isEnabled(this.index());
};
isEnabled関数は必須というわけではないんですが、引数に項目のインデックス(番号)を渡して、その項目の可否を判定する処理がよく使われます。
processOk関数でコールバック関数が呼ばれすが注意点あり
processOk関数はok処理のときに呼ばれます。この関数の中でcallOkHandler関数が呼ばれていて、ここでok処理として登録したコールバック関数が呼ばれる仕組みです。
また、processOk関数ではok処理のSEの再生も行われます。
processOk関数で注意すべきなのは、deactivate関数が呼ばれることです。これはウィンドウを非アクティブ状態にする関数で、これが呼ばれるとウィンドウが入力を受けつけなくなり、処理が進まなくなってしまいます。
まだまだTipsはあるけど…
1つの記事では書ききれないくらい、ウィンドウに関するTipsはあります。
今後、この記事に追記するという形でやっていきたいと思います。
それでは、楽しいツクールライフをお送りください。
コメント