【RPGツクールMV】イベント中にメニュー開閉 & 変数中の制御文字置換

最近RPGツクールにどハマりしているオカユです。

 

とりあえず、専門分野の知識を問うようなクイズゲームが作れないかなと格闘中。

で、いくつか問題にぶち当たったのでメモ。

[追記:メニュー表示時にメッセージウィンドが表示されたままになるように処理を追加]

 

イベント中にメニューを開きたい

会話形式のイベント中に選択肢を表示させるようなゲームを考えていたのだが、会話と会話の間にメニューを開くことができないのかと思い至った。

デフォでは、イベント進行中はプレイヤーはメニューを開けないようになっている。

 

用意するもの

1)プラグイン

 i)PictureCallCommon.js(トリアコンタン様)
  →イベント中は右クリックでメニューを呼び出せないのでピクチャボタンを用いる

 ii)YEP_UtilityCommonEvents.js(Yanfly様)
  →メニューを閉じると次の処理にスキップしてしまうので使用
  →CloseMenuEventを用いてメニューを開くコモンイベントを呼び出す
  →CloseMenuEventのパラメータをコモンイベントのIDにしておく

 iii)コアスクリプトrpg_windows.js内の記述を以下の通り改変
【元のスクリプト4322行目あたり】

Window_Message.prototype.checkToNotClose = function() {
    if (this.isClosing() && this.isOpen()) {
        if (this.doesContinue()) {
            this.open();
        }
    }
};

↓【改変後: || $gameSwitches.value(4)を追加】

//スイッチ4番がオンの間、文章イベント間でメッセージウィンド維持
Window_Message.prototype.checkToNotClose = function() {
    if (this.isClosing() && this.isOpen()) {
        if (this.doesContinue() || $gameSwitches.value(4)) {
            this.open();
        }
    }
};

  →デフォではメニュー表示中にメッセージウィンドウが非表示になってしまう
  →この改変でスイッチON中はメッセージ表示を維持するようになる
  →参考:めっちゃ細かい話 - こんにちは、ブログです。


2)変数

 i)文章の内容を格納する変数(例:#0001 文章内容

 ii)文章の進行度を格納する変数(例:#0002 文章進行度

3)スイッチ

 i)メニューを閉じるとONになるスイッチ(例:#0001 メニューを閉じた

 ii)文章表示コモンイベントを起動するためのスイッチ(例:#0002 文章表示テスト用

 iii)メニューボタンを表示するためのスイッチ(例:#0003 メニューボタン

 iv)メッセージボックスが消えるのを抑制する機能を制御するためのスイッチ(例:#0004 メッセージ閉抑制

4)コモンイベント

 i)ピクチャボタン押下でメニューを開くコモンイベント(トリガー:並列処理、スイッチ:#0003 メニューボタン)

◆メニュー画面を開く
◆スイッチの操作:#0003 = OFF

 ii)メニュー閉じをトリガに起動されるコモンイベント(トリガー:なし)

◆スイッチの操作:#0001 メニューを閉じた = ON

 iii)文章表示処理を行うコモンイベント(トリガー:並列処理、スイッチ:#0002 文章表示テスト用)

◆ループ
  ◆スイッチの操作:#0004 メッセージ閉抑制 = ON
  ◆文章:なし, ウィンドウ, 下
  :  :\V[1]
  ◆条件分岐:メニューを閉じたがON
    ◆スイッチの操作:#0001 メニューを閉じた = OFF
    ◆
  :それ以外のとき
    ◆スイッチの操作:#0004 メッセージ閉抑制 = OFF
    ◆ループの中断
    ◆
  :分岐終了
  ◆
:以上繰り返し
◆変数の操作:#0002 文章進行度 += 1
◆スイッチの操作:#0002 文章表示テスト用 = OFF
5)イベント

 i)一連のイベントを起動する(話しかける)ためのイベント
  EVページ1(トリガー:決定ボタン)

◆変数の操作:#0001 文章進行度 = 1
◆セルフスイッチの操作:A = ON

  EVページ2(出現条件:セルフスイッチA、トリガー:並列処理)

◆プラグインコマンド:P_CALL_SWITCH 1 1 1
◆ピクチャの表示:#1, Picture, 左上 (0,0), (100%,100%), 255, 通常
◆条件分岐:文章進行度 = 1
 ◆変数の操作:#0001 文章内容 = '文章01'
 ◆スイッチの操作:#0002 文章表示テスト用 = ON
 ◆
:分岐終了
◆条件分岐:文章進行度 = 2
 ◆変数の操作:#0001 文章内容 = '文章02'
 ◆スイッチの操作:#0002 文章表示テスト用 = ON
 ◆
:分岐終了
◆条件分岐:文章進行度 = 3
 ◆変数の操作:#0001 文章内容 = '文章03'
 ◆スイッチの操作:#0002 文章表示テスト用 = ON
 ◆
:分岐終了
◆条件分岐:文章進行度 = 4
 ◆セルフスイッチの操作:A = OFF
 ◆
:分岐終了


文章は変数に格納されるので制御文字を使用する際は\のかわりに\x1bを用いる。

変数に格納した文字列中の\を置換したい

上記のとおり、文字列を変数に格納して表示するやり方では制御文字に用いる\を\x1bと記述する必要がある。
しかし、制御文字による文章の演出を多用する場合は編集画面が煩雑になってしまう。

解決策
1)上記イベントEVページ2内の変数操作を以下のようにString.raw`◯◯`形式で記述

◆変数の操作:#0001 文章内容 = String.raw`\C[1]文章01`

2)上記コモンイベント iii)の文章表示処理直前に下記スクリプトを置く

◆変数の操作:#0001 文章内容 = $gameVariables.value(1).replace(/\\/g, '\x1b');

これを実行すると「文章01」というように文字色が青に変わる。
これで文章に制御文字をそのまま使用することができるように。


以上、まだまだ改善点はあるもののとりあえず備忘録ということで。