Class: TonMessage
ADVゲームのようなメッセージウィンドウ機能を提供します。スクリプトテキスト内のタグにより演出を制御できます。
Methods
void LoadScript(string filePath, string scriptName = null)
スクリプトファイルを読み込み、再生を開始します。
filePath: Contentルートからの相対パス (例: "script/test.txt")scriptName: スクリプト内のラベル名 (例: "Opening")。nullの場合はファイル全体を再生します。
注意: MGCB Editorでスクリプトファイルを追加する際は、Build Actionを Copy
に設定してください。多分UTF-8(BOM無し)がいいです。
void SetWindowRect(int x, int y, int width, int height)
メッセージウィンドウの表示位置とサイズを設定します。
x, y: 左上座標width, height: サイズ
void Show(string scriptText)
テキストを表示キューに追加し、ウィンドウを表示します。
scriptText: 表示するテキスト(タグ含む)
void Next()
メッセージを送り、次のページへ進むか、表示を終了します。
void Close()
ウィンドウを閉じます。
bool IsBusy()
テキスト送り中、または入力待ち状態かどうかを返します。
void SetTextStyle(float scale, float lineSpacing, float kerningOffset = 0f)
文字の基本サイズ、行間の高さ(px)、文字間隔のオフセット(px)を設定します。
void Update(GameTime gameTime, bool isInput = false)
メッセージの文字送り処理や待機時間の更新を行います。毎フレーム呼び出してください。
gameTime: ゲーム時間情報isInput: ページ送り/スキップ入力があった場合に true を渡します。
void SetTextSpeed(float speedMs)
デフォルトの文字送り速度(1文字あたりの表示時間ms)を設定します(初期値=50ms)。
speedMs: 文字送り時間(ミリ秒)。小さいほど高速になります。
string GetEvent()
[event:xxx]タグでキューイングされたイベントIDを取得します。
Supported Tags
使用可能なタグ一覧
テキスト中に以下のタグを埋め込むことで、表示を制御できます。
[next]: 入力待ちを行い、ページ送りします。[next:ms](例:[next:1000]) と記述すると、入力待ちをせずに指定ミリ秒後に強制ページ送りします。[next]以降その行の内容は無視されます。[wait:ms]: 指定ミリ秒待機します。(例:[wait:1000])[speed:ms]: 文字送り速度(1文字あたりのミリ秒)を変更します。設定は即時反映され、時間を消費しません。[color:Name/Hex]: 文字色を変更します。(例:[color:Red])[size:pt]: 文字サイズを変更します。(例:[size:32])[shake:intensity]: 文字を振動させます(正弦波)。[shake:x,y,speed]で縦横の揺れ幅、振動速度を指定可能です。(例:[shake:2],[shake:5,0,50])[end]: ページ送りを待ち、入力があったらウィンドウを閉じてスクリプトを終了します。以降のテキストは無視されます。[rotate:degrees]: 文字の回転角度(度数法)を設定します。(例:[rotate:45])[font:fontId]: 使用するフォントを変更します。登録済みのフォントIDを指定してください。[reset]: 文字スタイル(色、サイズ、回転、速度、フォント)を初期値に戻します。[icon:imageName]: 指定した画像アイコンを文中に表示します。文字間オフセット(KerningOffset)が適用されます。[event:ID]: イベントIDを発行します(GetEventで取得可能)。[input:mode]: ユーザー入力によるスキップ/ページ送りの有効無効を切り替えます。[input:disable]で無効化し、[input:enable]で再度有効化します。強制イベントシーンなどで使用します。
Sample Code
// In Initialize()
// Set position and size
Ton.Msg.SetWindowRect(20, 400, 600, 150);
// Show Message Script
string script =
"Hello.[wait:500] This is [color:Red]Red Text[reset].\n" +
"Welcome to [icon:icon_star] Mononotonka.[next]" +
"Select an option:\n" +
"[event:opt1] Option 1 (Yes)\n" +
"[event:opt2] Option 2 (No)";
Ton.Msg.Show(script);
// In Update()
// Advance text on input ("A" button or B button)
bool isInput = Ton.Input.IsJustPressed("A") || Ton.Input.IsJustPressed("B");
Ton.Msg.Update(gameTime, isInput); // Don't forget to pass gameTime!
// Check for Event (Selection)
string eventId = Ton.Msg.GetEvent();
if (eventId != null)
{
if (eventId == "opt1") { /* Selected Yes */ }
else if (eventId == "opt2") { /* Selected No */ }
}
// Check if busy
if (Ton.Msg.IsBusy())
{
// Pause game logic while message is showing?
}
Script Format
スクリプトファイル内では、行頭に # を付けることで複数のスクリプトを記述できます。
また、行頭に ; を付けるとコメント行となり、表示されません。
#Opening
; これはコメントです
[icon:Hero] こんにちは!
これはオープニングです。[next]
#Ending
[icon:Hero] ありがとう!
また会いましょう。[next]
Sample Code
// Initialize
Ton.msg.Initialize();
// Load script from file (Play "Opening" section)
Ton.msg.LoadScript("script/scenario.txt", "Opening");
// Manual Control
if (Ton.input.IsJustPressed("A"))
{
Ton.msg.Next();
}