情報表示ウィンドウを調べてみた

前回、前々回と Window Window_Base、を調べました。
今回は Window_Base 直下のクラスについて調べていこうと思います。

依頼主が女子パターンや男子がセクハラ受けるパターンもありますが

Window_Baseをカテゴリ分けする

Window_Base 以下は、次のような感じになってます。
Window_Selectable ってのもあるんですが、大量に子孫ぶら下げているクラスなんで、またの機会にします。

 ざっと、以下の3つのカテゴリに分けてみました。

単純表示
Window_MapNameWindow_GoldWindow_Help
ステータス表示
Window_EquipStatusWindow_ShopStatusWindow_SkillStatus
$gameMessage経由表示
Window_MessageWindow_ScrollText

単純表示

 では、簡単そうなやつから順次見て行きましょう。
 yamachanさんのウィンドウ表示のコードの流れでは Window_MapName が調べられてました。
 …特にもう書くことないな。
 そもそも、新規の機能はフェードイン・アウトと専用の背景描画程度しかない、ほぼ Window_Base そのまんまなクラスだし…次行ってみましょう。

 Window_Gold は、通貨単位と所持金を返すメソッドが定義されてますが、それだけですね。
 所持金の値を描画する drawCurrencyValue()Window_Base で定義されているので、新しく定義する必要ないし。
 ちなみに、Window_MapNameWindow_Goldも、windowHeight()windowWidth() が定義されてますが、プロパティの widthheight で十分という感じもします。

 Window_Help は、行数を指定して生成すると横幅( Graphics.boxWidth )いっぱいのウィンドウを作る。
 んで、setText() は[文章の表示]コマンドと同様の制御文字を含む文字列を設定できる。setItem() は渡したアイテム( RPG.BaseItem )の説明文を表示する。
 といった非常に分かりやすいウィンドウで、そのままでも使いやすく、コードも最小限なので新たなウィンドウクラスを作る際の参考になります。

 てな訳で、Window_Help を利用した、著作権表記や操作説明に便利なタイトル画面で一枚のウィンドウだすプラグイン作りました。
 TF_TextWindowMenu.jsです。

ステータス表示

 Window_EquipStatus は装備前後のステータスを表示するウィンドウ。
 単に追加しただけでは、何も表示されないのでアクター( Game_Actor )を渡しています。
 Window_Help にアイテム渡すと説明文が表示されるのと似た感じで、オブジェクトを渡して細かい処理はもらった方が行うようになってます。
 外から細かく指示すると機能が分散してコードがわかりにくくなってしまいますが、これなら個々のクラスに必要な機能が集中するので、混乱しにくい良い方法だと思います。
 渡すオブジェクトの設計がちゃんとしてること前提ですけどね。

 というわけで、以下のようにするとアクターのステータスが表示されます。

	// ↓ ここから追加部分
	const statusWindow = new Window_EquipStatus( 100, 20 );
	this.addChild( statusWindow );
	statusWindow.setActor( $gameActors.actor( 1 ) );
};

 装備の着脱結果は setTempActor() で指定します。
 なお、個別の draw系のメソッドも用意してあって、なかなか万全の体制です。

 Window_EquipStatus の場合は装備の時に表示されるウィンドウなので、Scene_Equip とそこに付随するWindow_EquipSlotWindow_EquipCommandWindow_EquipItem が関連してます。
 この辺はコマンド選択など、まだ調べてないウィンドウが関わってるので、とりあえず放置します(笑)

 Window_ShopStatusWindow_SkillStatus もだいたいおんなじ感じですね。

$gameMessage経由表示

 これまでのウィンドウはウィンドウのメソッドを使って表示内容を指示しました。
 メッセージやスクロール表示は $gameMessage( Game_Message ) に設定内容を渡し、分割して処理します。

Window_Message

 Window_Message は選択肢などのウィンドウも持っていて、専用の別ページを用意して書いた方がいいんじゃないかというぐらい多機能です。
 ここでは、超ざっくりとした説明だけにしておきます。

 次のスクリプトは、今までと同様にタイトルで実行することを前提としているので、Window_Message を生成・追加しています。

	
	// ↓ ここから追加部分
	const messageWindow = new Window_Message();
	this.addChild( messageWindow );
	$gameMessage.add( 'へろーワールド!' );	// 大体は、この行だけでいける
};

 マップやバトルのようなイベントコマンドが実行できるシーンでは、既に Window_Message は追加されているので、$gameMessage.add() さえ実行すれば、自動的に Window_Message が追加された文字を読みにいって、画面にメッセージが表示されます。
 簡単で便利ーって気がしましたが、そもそも[文章の表示]コマンドでやってることと一緒なので、特に嬉しくもなかったです。

 なんでこういう回りくどいことをしているのか疑問が湧きます。
 考えてみると、メッセージウィンドウは文字が即時表示されるのではなく、アニメーション表示され、表示途中での入力待ちなどユーザのプレイと1対1に対応した動きをする必要があります。
 また、連続して表示される場合、ウィンドウを閉めたり開けたりせずに中身だけ書き換えて表示するといった細かい制御も必要です。
 さらには途中で選択肢の入力を求める場合もあります。
 なので、メッセージウィンドウの外にメッセージを管理するクラスを用意した方が、制御しやすいという判断だと思います。
  Window_Message の使い方を調べると、ほとんど Game_Message の使い方になっちゃいます。
  Window_Base 直下のクラスを調べるのが目的なので、今回はひとまずここまで。

Window_ScrollText

 Window_ScrollTextWindow_Message と同様に $gameMessage に内容を設定します。
 setScroll() を事前に行っておくことで両者の区別が可能です。

	// ↓ ここから追加部分
	const scrollWindow = new Window_ScrollText();
	this.addChild( scrollWindow );
	
	$gameMessage.setScroll(  2 , false );	// これでスクロールに設定!
	$gameMessage.add( `スクロールする
へろーワールド!` );
};

 add() してテキストを Game_Message が持つと、Window_Message が読みにきてメッセージを表示するので、add() より先に各種設定を送っておく必要があります。
 と言っても読みにくるのは次のフレームなので、上記のコードのように同一フレーム内での設定なら、どっちが先でも支障ありません。

 また Window_Message と同様に Window_ScrollText も、マップやバトルシーンに存在してるので、ウィンドウの生成・追加部分のコードは不要です。

 ちなみに、お行儀よく行きたいなら $gameMessage.isBusy() で他の処理が走ってないか確認してから実行するのが良いです。
 大抵の場合、並行して実行される可能性は全然ない箇所で使うと思うんで、あんまり気にしなくていい気がしますけど。

まとめ

 単に情報を表示するだけのウィンドウ群ですが、意外に理解するのに手間取りました。
 どんなコードでも、自分とは異なる感覚を持った人が作っているので、読むのは苦労するのが常です。
 ともあれウィンドウの表示もかなり理解が進みましたので、次は選択ウィンドウを調べてみたいと思います。

 そこで結論。

追加表示には Window_Help が使いやすいぞ!