『RPGツクールMZ』のステータス表示周り
『RPGツクールMZ』のステータス表示周りを調べてみました。
いわゆるHUD(Headup Display)と呼ばれる、HPなどの各種ゲージが並んでいる部分ですね。
個人的にはHUDは戦闘機のコクピットにあるやつ以外だと強い違和感があるのですが、もうゲーム制作界隈では標準的な用語になっているので、郷にいればの精神でやっていこうと思います。
関連記事としては、次のようなものがあります。
例によって『RPGツクールMZ』非公式JavaScriptリファレンス のページにクラスなどリンクします。
まずは前提について
『RPGツクールMV』の頃には Window_Base クラスにHUD関連のメソッドが揃っていて、その辺は『ウィンドウの内容を描いてみた』って記事とかに書いています。
『RPGツクールMZ』では、この辺りのクラスが整理されて Window_StatusBase の方にHUD関連のメソッドは引っ越してきています。
おかげでかなりウィンドウ関連クラスの見通しは良くなりました。もう少し機能を分散したほうがいいんじゃないかとも思いますが。
以下クラスツリーです。
Window_StatusBase に大量にクラスがぶら下がっていますが、MVの時はHUD関連は Window_Base にあったわけで、ここに書かれていないウィンドウ全体に関わっていたことになります。
MVでは「一番根元のクラスに機能持たせておけば、必要になった時にすぐ使えるでしょ」みたいな感じでしたが、流石にそれは雑と判断したんだと思います。
とくに色関連は ColorManager に移動して、スッキリしました。
ColorManager の使い方はすごく簡単で、取得したい色に対応したメソッドを呼ぶだけです。
ColorManager.crisisColor();	// 危険色(カラー番号:17)を取得。
この辺りのウィンドウの内容の描画周りは『 カスタムメニュー作成プラグインを調べてみた』で紹介したプラグインを活用する際にも避けて通れない部分です。
逆に完全に自作したいという人でも、典型的な描画コマンドはカスタムメニュー作成プラグイン(以後カスタムメニュー)の引数に用意されているので練習になります。
最終的にカスタムメニューがあればプラグインそのものを自作する必要はないな、に落ち着く可能性も大です。
というわけで、この記事は実質『カスタムメニュー作成プラグインを調べてみた2』です。
Window_Base
かなり引っ越したとはいえ Window_Base が重要なクラスであることには変わりなく、内容の表示のためのメソッドはたくさんあります。
Window_Base: 文字情報の取得
制御文字の \n[n] と \p[n] で名前を置き換えるために用意してあるわけですが、クラス内部で使う用ですね。
制御文字は存在しない番号が指定されることがあるので、そのような場合に空文字列を返す処理が上記メソッドには入ってますが、直接以下のメソッドを使ってもいいでしょう。
$gameActors.actor( actorIndex );	// actorName (actorIndex) とほぼ同じ。
$gameParty.members()[ partyMemberIndex - 1 ] ;	// partyMemberName (partyMemberIndex) とほぼ同じ。
なお[データベース]-[用語]にある文は TextManager が管理しています。
TextManager.currencyUnit;	// [通貨単位]に設定した文字を取得。
という感じで、ごく簡単に設定した文字を取得できます。
これを使わずに直接文字列で "HP" とか指定すると[データベース]-[用語]で "体力" と設定していた場合に意味が通じなくなるので注意です。
特にプラグインを作る場合は気をつける必要があります。
Window_Base: 表示設定
これも制御文字に関わるものが多いですが、制御文字で変更できないものもあります。
| メソッド | 説明 | 
|---|---|
| changeOutlineColor (color) | 文字の輪郭色の設定 | 
| changePaintOpacity (enabled) | 選択の可・不可の設定 | 
| changeTextColor (color) | 文字色の設定 | 
| systemColor () | システム色を返す | 
| makeFontBigger () | 文字を大きくする(制御文字 \{) | 
| makeFontSmaller () | 文字を小さくする(制御文字 \}) | 
| resetFontSettings () | フォントを規定値に戻す(文字色も含む) | 
| resetTextColor () | 文字色を規定値に戻す | 
これらの他にprocessColorChange()みたいな process が頭についたメソッドがありますが、これも制御文字用で範囲外の値の処理をしてたり全くしてなかったりします。
あえて使う必要はないかと思います。
制御文字\FS[n]用のメソッドがないなと思われるかもしれませんが、これは直接プロパティを設定します。
this.contents.fontSize = 32;	// 文字サイズを32ピクセルに設定
またフォントを変更する場合は次の通り。
this.contents.fontFace = $gameSystem.mainFontFace();// [システム2]-[高度な設定]-[メインフォントのファイル名]
this.contents.fontFace = $gameSystem.numberFontFace();// [システム2]-[高度な設定]-[数字フォントのファイル名]
対象となるWindowクラスの中で読んでいる想定なのでthisはWindow(を継承した)クラスです。
制御文字\PX[n],\PY[n]については直接の指定方法は用意されていませんが、後述のdrawText(),drawTextEx()の引数にx,yがあるので、そこで配置を調整できます。
そもそもdrawTextEx()は表示文字列の中に制御文字自体を使えるのですが。
Window_Base: 表示座標・サイズの取得
レイアウトをする際に使う各種UI部品のサイズを取得するためのメソッドです。
色や文字列同様に直接リテラルで指定すると、一貫性が崩れてしまうので、極力これらのメソッドを使って取得した値でレイアウトを行うべきでしょう。
| メソッド | 説明 | 
|---|---|
| baseTextRect (actorIndex) | 文字表示用の矩形範囲を返す | 
| calcTextHeight (textState) | 指定したテキストの表示時の高さを返す | 
| contentsHeight () | コンテンツの高さを返す | 
| contentsWidth () | コンテンツの幅を返す | 
| fittingHeight (numLines) | 指定された行数に必要な高さを返す | 
| itemHeight () | 項目の高さ(規定値: 36)を返す | 
| itemPadding () | 項目パディング幅(規定値:8ピクセル)を返す | 
| itemWidth () | 項目の幅を返す | 
| lineHeight () | 行の高さ(規定値: 36ピクセル)を返す | 
| maxFontSizeInLine (line) | 指定行での最大フォントサイズを返す | 
| textSizeEx (text) | 制御文字による変更後の文字サイズを返す | 
| textWidth (text) | 指定文字列を描画した場合の幅を返す | 
※ここでのコンテンツとは「ウィンドウの枠を除いた表示部分」を指します。
※数値の単位はピクセルです。
※行とあるのは、文字を表示する場合の行を指します。
※項目とあるのはコマンドやアイテムなど選択のためのUIの1単位を指します。本稿では基本的に解説しません(別稿で解説するかもしれません)
Window_Base: 内容の表示
文字・アイコンなどのウィンドウ内の情報を描画するためのメソッドです。
ウィンドウの内容をカスタマイズする場合の主役です。
コアスクリプトでこれらのメソッドを使っている箇所を見つけ、そのメソッドをプラグインで上書きする、といった使い方が基本となるでしょう。
複雑なゲームシステムに対応する場合は、新規ウィンドウクラスを作って丸ごとレイアウトを変更した方が、いいかもしれません。
| メソッド | 説明 | 
|---|---|
| drawCharacter (characterName, characterIndex, x, y) | 歩行キャラクタを描く | 
| drawCurrencyValue (value, unit, x, y, width) | 所持金を通貨単位付きで描く | 
| drawFace (faceName, faceIndex, x, y, width opt, height opt) | 顔画像を描く | 
| drawIcon (iconIndex, x, y) | アイコンを描く | 
| drawItemName (item, x, y, width) | [アイテム]の[名前]を描く | 
| drawRect ( x, y, width, height ) | 矩形を描く | 
| drawText (text, x, y, maxWidth, align) | 文字列を描く | 
| drawTextEx (text, x, y, width) | 制御文字を含む文字列を描く | 
とくにdrawTextExの使用頻度が高いと思います。
以上が Window_Baseクラスに含まれる内容表示に関連するメソッドです。
Window_StatusBase
次は Window_StatusBaseクラスのメソッド。
先に示したクラスツリーの一部を抜粋すると、次のように Window_Baseクラスから Window_StatusBaseまでに Window_Scrollable、Window_Selectable というクラスを継承しています。
ただこの辺は名前の通り「スクロールに関する機能追加」と「コマンドなどの選択に関する機能追加」なので、単純に内容を描画することに関する新たな機能は追加されていません。
また Window_StatusBaseクラスをさらに継承したクラスに関しては、ほとんど描画系の機能は追加されていません。
なので Window_StatusBaseクラスを詳細に見ていきます。
引数として渡しているactorはアクター情報を持ったGame_Actorクラスです。
Window_StatusBase: 文字情報の取得
| メソッド | 説明 | 
|---|---|
| actorSlotName (actor, index) | アクターの[装備タイプ]の表示名を返す | 
Window_StatusBase: 表示座標・サイズの取得
| メソッド | 説明 | 
|---|---|
| gaugeLineHeight | ゲージの線の高さ(規定値24ピクセル)を返す | 
Window_StatusBase: 内容の表示
| メソッド | 説明 | 
|---|---|
| drawActorCharacter (actor, x, y) | アクターの[歩行キャラ]を描く | 
| drawActorClass (actor, x, y, width) | アクターの[職業]を描く | 
| drawActorFace (actor, x, y, width, height) | アクターの[顔]画像を描く | 
| drawActorIcons (actor, x, y, width) | アクターのアイコンを描く | 
| drawActorLevel (actor, x, y) | アクターの[レベル]を描く | 
| drawActorName (actor, x, y, width) | アクターの[名前]を描く | 
| drawActorNickname (actor, x, y, width) | アクターの[二つ名]を描く | 
| drawActorSimpleStatus (actor, x, y) | アクターの簡易版ステータスを描く | 
Window_StatusBase: 内容の配置
『RPGツクールMZ』になって、ステータス表示をSpriteクラスとして配置する部分ができました。
draw系メソッドが紙に直接描くのに対して、紙にシールを貼る感覚が近いかもしれません。
| メソッド | 説明 | 
|---|---|
| placeActorName (actor, x, y) | アクター名を配置 | 
| placeBasicGauges (actor, x, y) | HP・MP・TPの基本ゲージを配置 | 
| placeGauge (actor, type, x, y) | ゲージを配置 | 
| placeStateIcon (actor, x, y) | 状態アイコンを配置 | 
| placeTimeGauge (actor, x, y) | タイムゲージを配置 | 
まとめ
この辺りの描画メソッドは、カスタムメニュー作成プラグインを調べてみたに書いた機能のうち、スクリプトに書くことが多いと思うので、副読本的に使ってもらえると幸いです。
レッツエンジョイ ツクールライフ!


Discussion