情報表示ウィンドウを調べてみた
前回、前々回と Window
Window_Base
、を調べました。
今回は Window_Base
直下のクラスについて調べていこうと思います。
Window_Baseをカテゴリ分けする
Window_Base
以下は、次のような感じになってます。
Window_Selectable
ってのもあるんですが、大量に子孫ぶら下げているクラスなんで、またの機会にします。
- Window
- Window_Base
- Window_EquipStatus 装備時のステータス
- Window_Gold 所持金
- Window_Help 項目が選択された際の解説
- Window_MapName マップの[表示名]を出す
- Window_Message [文章の表示]
- Window_NameEdit [名前入力の処理]名前表示・編集
- Window_ScrollText [文章のスクロール表示]
- Window_ShopStatus [ショップの処理]のステータス
- Window_SkillStatus スキル選択時のステータス
- Window_Base
ざっと、以下の3つのカテゴリに分けてみました。
- 単純表示
Window_MapName
、Window_Gold
、Window_Help
- ステータス表示
Window_EquipStatus
、Window_ShopStatus
、Window_SkillStatus
- $gameMessage経由表示
Window_Message
、Window_ScrollText
単純表示
では、簡単そうなやつから順次見て行きましょう。
yamachanさんのウィンドウ表示のコードの流れでは Window_MapName
が調べられてました。
…特にもう書くことないな。
そもそも、新規の機能はフェードイン・アウトと専用の背景描画程度しかない、ほぼ Window_Base
そのまんまなクラスだし…次行ってみましょう。
Window_Gold
は、通貨単位と所持金を返すメソッドが定義されてますが、それだけですね。
所持金の値を描画する drawCurrencyValue()
は Window_Base
で定義されているので、新しく定義する必要ないし。
ちなみに、Window_MapName
も Window_Gold
も、windowHeight()
と windowWidth()
が定義されてますが、プロパティの width
と height
で十分という感じもします。
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_EquipSlot
、Window_EquipCommand
、Window_EquipItem
が関連してます。
この辺はコマンド選択など、まだ調べてないウィンドウが関わってるので、とりあえず放置します(笑)
Window_ShopStatus
とWindow_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_ScrollText
も Window_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 が使いやすいぞ!