ツクールMVの文章の表示では\V[n]
でn番の変数の中身を文章内で表示することができます。
今回ゲームを作成していて、文章表示に使う変数の中にも制御文字を入れたい場面が出てきました。
具体的にはプラグインのYEP_MessageCoreを導入することで\I[n]
でn番のアイコンを文章内に表示できるのですが、この制御文字を変数に入れておく必要がありました。
ところが、これを\V[n]
で表示しても「I[n]
」とそのまま表示されてしまいます。
これはツクマテの質問でも対応方法が回答されている内容です。
上記リンクで回答されている方法でも問題なく表示できるのですが、直感的ではないので今回はプラグインを作成しました。(といっても、非常にシンプルな内容です)
ダウンロード
ExpandMessageVar.js
上記リンクの右クリックメニューから保存できます。
プラグインを有効にするだけでOKです。
YEP_MessageCore.jsを使用している場合、その上下どちらに入れても問題ないことを確認しています。
解説
ここからはプログラム的な話なので興味のある方向けです。
エスケープコード
制御文字は、その内容を解析する前に\V[n]
なら\x1bV[n]
に変換されています。
\x1b
のことをエスケープコードといいます。
\x
は後ろに続く16進数で表現した文字コードであるという指定、1bは10進数に直すと27です。
ASCIIコード表を見ると、27番がエスケープコード(ESC)であることが分かりますね。
\x1b
までで1文字の文字なのですが、キーボードから入力することはできないのでこのように表現しています。
エスケープコードの後ろには制御の指定が入るというお約束になっているので、エスケープコードに変換しておくことでプログラムから扱いやすくなるわけです。
変数の中に制御文字を組み込めない理由
文章の表示で制御文字を展開する処理は以下の手順で行われています。
- バックスラッシュのエスケープコードへの変換
\V[n]
の展開- その他の制御文字の展開
もうお気づきでしょうか。
\V[n]
で展開された変数の中身に制御文字があっても、その中にあるバックスラッシュはエスケープコードには変換されていないのです。
そのため、変数の中に制御文字を入れる際は\I[n]
ではなく\x1bI[n]
とすれば正しく表示されるわけですね。
プラグインでやっていること
プラグインでは、上記手順の2番目、\V[n]
の展開までを行ったあと、もう一度エスケープコードへの変換から再度手順を実行するように修正しました。
変数の中に入れてある制御文字についてもエスケープコードへの変換が行われるため、\x1b
とつける必要がなくなりました。
今回は変数に入れる制御文字に\V[n]
をまた使っていて…というケースは考えていません。
そこまで対応する場合は、\V[n]
を見つける度にエスケープコードへの変換からやり直すような処理にする必要があります。