《RPGツクールMV》プラグイン開発でのWindow_Selectableクラスの使い方

RPGツクールMV

RPGツクールMVでプラグインを作っていると、Window_Selectableクラスを使うのがほぼ必須になってくると思います。

Window_Selectableクラスは選択式のウィンドウを作るときに必須のクラスで、メニューをはじめ様々なウィンドウで使われています。

今回はWindow_Selectableクラスの使い方について解説していこうと思います。

Window_Selectableクラスの基本

ますはWindow_Selectableクラスを使うにあたって基本になることを説明します。

説明することは次の3つです。

  • 継承させて使用
  • maxItems関数は上書き必須
  • drawItem関数も上書き必須

継承させて使用

Window_Selectableクラスは単体で使うのではなく、継承させて使うことが前提に実装されています。

クラスを継承させる書き方は以下のようにします。

function Window_Original() {
  this.initialize.apply(this, arguments);
}

Window_Original.prototype = Object.create(Window_Selectable.prototype);
Window_Original.prototype.constructor = Window_Original;

Window_Original.prototype.initialize = function(x, y, width, height) {
  Window_Selectable.prototype.initialize.call(this, x, y, width, height);
};

Window_Originalというクラスを新しく作って、Window_Selectableクラスから継承させています。

こうすることでWindow_Selectableクラスのプロパティや関数を引き継いだ新しいクラスを作ることができます。

ウィンドウ系のクラスだけではなく、他のクラスも同じような書き方で継承させます。

maxItems関数は上書き必須

Window_Selectableクラスは継承させて使うと説明しましたが、その根拠になっている関数にmaxItemsがあります。

この関数は表示する項目の最大数を返すためのものですが、Window_Selectableクラスでは0を返すようになっています。
※rpg_windows.jsの762行目

つまり、項目の最大数が0として他のさまざまな処理がされるということです。

これではちゃんとした処理にならないので、この関数は内容を変更する必要があります。

特に変わった処理をしないのであれば、次のように上書きすればOKです。

Window_Original.prototype.maxItems = function() {
  return  this._list ? this._list.length : 0;
};

Window_Selectableクラスは表示する項目を_listというプロパティで管理しています。

このプロパティの長さを返すようにすれば、項目の最大数を返していることになります。

_listプロパティはWindow_Selectableクラスのさまざまな箇所で使われているので、ソースコードを読んで理解を深めておくといいでしょう。

drawItem関数も上書き必須

Window_SelectableクラスにはdrawItemという関数があります。この関数はウィンドウに表示される項目を描画します。

Window_Selectableクラスではこの関数は空になっていて何もしません。

この関数はdrawAllItems関数などWindow_Selectableクラス内のいろいろな関数から呼ばれるので、しっかりと上書きしておく必要があります。

drawItem関数の中身は表示する内容によってさまざまですが、_listプロパティに入っている項目を表示することになる場合が多いです。

例えば、次のような書き方が使われます。

Window_MPWF_MENU_COMMAND.prototype.drawItem = function(index) {
  var item = this._list[index];
  var rect = this.itemRect(index);
};

this._list[index]で現在選択されている項目を表していて、this.itemRect(index)が項目の領域(位置と大きさ)になります。

表示する項目は、このitemRect関数で得られた領域の中に描画するようにします。

参考にすべきウィンドウ系のクラス

Window_Selectableクラスは既存のプログラムでもたくさん使われています。

Window_Command
Window_MenuStatus
Window_ItemList
Window_SkillList
Window_EquipSlot
Window_Status
Window_SavefileList
Window_ShopBuy
Window_ShopNumber
Window_NameInput
Window_NumberInput
Window_BattleLog
Window_BattleStatus
Window_BattleEnemy
Window_DebugRange
Window_DebugEdit

ざっと数えただけでも16種類のウィンドウ系のクラスで継承されています。

これだけあるウィンドウ系のクラスの中で参考にすべきクラスをあげると、Window_CommandクラスとWindow_ItemListクラスとWindow_SkillListクラスです。

Window_Commandクラスはメニュー系のウィンドウに使われているので、メニューなどの処理がどうなっているのかを知りたいときに参考にするクラスです。

Window_ItemListクラスは武器やアイテムなどの表示に使うクラスです。

アイテムの表示や処理などを変えたいなら、このクラスを継承させて使うか、このクラスの処理を上書きする必要があります。

Window_ItemListクラスではisEnabledという関数を使って、アイテムの使用不可判定やグレーアウト表示を実現しています。この辺は自作のクラスでも参考になる部分は多いです。

Window_SkillListクラスはスキルの表示に利用されるクラスです。

Window_ItemListクラスと似ていますが、このクラスはアクターのデータを取ってきている処理が多いので、アクター絡みのウィンドウを作るときの参考になります。

Window_Selectableクラスで変則的なウィンドウもできる

僕が公開している《マッチポンプ武器工房》というゲームには自作のウィンドウが使われていますが、その例が以下です。

これはバトルメンバーを選択する画面です。

画面左側にキャラクターの歩行画像を表示させて選択できるようにして、画面右側にキャラクターのステータスを表示しています。

1つのウィンドウの中に役割の異なる情報を表示させているという変則的な使い方をしています。

また、画面下に表示されている「バトルへ」と「戻る」は他のキャラクターと同じ項目として_listプロパティで扱っていますが、内部的な処理を変えています。

Window_Selectableクラスのキモとなる関数たち

maxItems関数とdrawItem関数は上書き必須として説明しましたが、これら以外にも重要な関数があります。

itemRect項目とカーソルの表示領域を計算する。
maxCols列数を返す。この値がいろいろな箇所で利用される。
activateウィンドウをアクティブにする。カーソルが点滅するようになる。
deactivateウィンドウのアクティブ状態を解除する。ウィンドウが非表示になるわけではない。
select項目を選択する。カーソルも移る。
processOk選択された項目で決定ボタンが押された時に呼ばれる。デフォルトでは内部でdeactivateが呼ばれることに注意。

あげればキリがないんですが、自分でプラグイン開発をしていて特に気を付けた方がいいと思った関数たちを紹介しました。

特にitemRectは重要だと思います。

まとめ:Window_Selectableクラスはプラグイン開発のキモ

という感じでWindow_Selectableクラスの使い方を紹介してきましたが、RPGツクールMVにおいてWindow_Selectableクラスはキモといっても良いと思います。

Window_Selectableクラスを使いこなせれば、できることの幅がグッと広がって開発が楽しくなります。

プラグインの開発は実際にやってみないとわからないことも多いので、自分の手を動かしてWindow_Selectableクラスを継承させて使ってみてはいかがでしょうか。

コメント

タイトルとURLをコピーしました