RPGツクールMVのメインメニューの左側のコマンドを追加する方法

この記事ではRPGツクールMVでのメインメニュー(アイテムとかステータスとかセーブとかができる画面) に自作のコマンドを追加する方法を紹介していく。

やり方

すでにScene_ExStatusというシーンクラスを作成しているという前提で話を進めていく。 結論から言うと、以下のようなコードを書けばよい。

// メニューコマンドウィンドウにステータスコマンドを追加
const _Window_MenuCommand_addOriginalCommands = Window_MenuCommand.prototype.addOriginalCommands;
Window_MenuCommand.prototype.addOriginalCommands = function () {
        _Window_MenuCommand_addOriginalCommands.call(this);
        this.addCommand('Exステータス', 'exStatus');
};

// メニューシーンにステータスコマンドの処理を追加
const _Scene_Menu_createCommandWindow = Scene_Menu.prototype.createCommandWindow;
Scene_Menu.prototype.createCommandWindow = function () {
    _Scene_Menu_createCommandWindow.call(this);
    this._commandWindow.setHandler('exStatus', this.commandExStatus.bind(this));
};

Scene_Menu.prototype.commandExStatus = function () {
    SceneManager.push(Scene_ExStatus);
};

以下はそれぞれのメソッドについて補足していく。

Window_MenuCommand.prototype.addOriginalCommands

Window_MenuCommandとはメインメニューの左側にあるコマンド画面のこと。 アイテムとかステータスとかセーブとかがあるウィンドウのこと。

Window_MenuCommandクラスにはaddOriginalCommandsメソッドという、まさに自作のコマンドを追加できるメソッドが 用意されているので、これをオーバーライドすることで自作のコマンドを追加できる。

自作コマンドを追加するには、addCommandメソッドを使うとよい。 第1引数にはメニュー名(画面に表示される)を指定し、第2引数にはシンボル(どのメニューがクリックされたかをプログラム側が識別するためのもの)を指定する。

// メニューコマンドウィンドウにステータスコマンドを追加
const _Window_MenuCommand_addOriginalCommands = Window_MenuCommand.prototype.addOriginalCommands;
Window_MenuCommand.prototype.addOriginalCommands = function () {
        _Window_MenuCommand_addOriginalCommands.call(this);
        this.addCommand('Exステータス', 'exStatus');
};

詳細は以下の記事を見るとよい。

Scene_Menu.prototype.createCommandWindow

さて、さきほどWindow_MenuCommandで自作コマンドを追加したが、コマンドが実行した後の挙動をしてしていない。 そこでScene_Menuクラスを拡張することで、Exステータスがクリックされた時の挙動を指定する必要がある。

やり方としては、Scene_Menu.prototype.createCommandWindowの中でthis._commandWindow.setHandlerで 挙動を追加してあげるとよい。

this._commandWindowプロパティには先ほどのWindow_MenuCommandクラスのインスタンスが格納されている。

setHandlerは第1引数にシンボル、第2引数にシンボルが呼び出された時の処理を記述する。

// メニューシーンにステータスコマンドの処理を追加
const _Scene_Menu_createCommandWindow = Scene_Menu.prototype.createCommandWindow;
Scene_Menu.prototype.createCommandWindow = function () {
    _Scene_Menu_createCommandWindow.call(this);
    this._commandWindow.setHandler('exStatus', this.commandExStatus.bind(this));
};

Scene_Menu.prototype.commandExStatus = function () {
    SceneManager.push(Scene_ExStatus);
};