Class: TonMessage
ADVゲームのようなメッセージウィンドウ機能を提供します。スクリプトテキスト内のタグにより演出を制御できます。
Methods
スクリプトファイルを読み込み、再生を開始します。
filePath: Contentルートからの相対パス (例: "script/test.txt")scriptName: スクリプト内のラベル名 (例: "Opening")。nullの場合はファイル全体を再生します。
注意: MGCB Editorでスクリプトファイルを追加する際は、Build Actionを Copy
に設定してください。多分UTF-8(BOM無し)がいいです。
メッセージウィンドウの表示位置とサイズを設定します。
x, y: 左上座標width, height: サイズ
テキストを表示キューに追加し、ウィンドウを表示します。
scriptText: 表示するテキスト(タグ含む)
メッセージを送り、次のページへ進むか、表示を終了します。
ウィンドウを閉じます。
テキスト送り中、または入力待ち状態かどうかを返します。
文字の基本サイズ、行間の高さ(px)、文字間隔のオフセット(px)を設定します。
Ton.Instance.Draw(gameTime) 内で Ton.Msg を自動描画するかどうかを設定します。
true: 既定値です。通常の描画順で自動的にTon.Msg.Draw()が呼ばれます。false: 自動描画を止めます。仮想画面や独自レイヤーへ描きたい場合は、ユーザー側でTon.Msg.Draw()を呼び出してください。
現在のメッセージを描画します。SetAutoDraw(false) を指定した場合や、RenderTargetへ描き込みたい場合に手動で呼び出します。
描画先は呼び出し時点の Ton.Gra の描画先に従います。仮想画面へ描く場合は、先に Ton.Gra.SetRenderTarget(...) を呼んでください。
自動改行時の折り返しモードを設定します。既定値は MessageLineBreakMode.TokenAware です。
MessageLineBreakMode.TokenAware: 語や句読点を考慮して折り返します。MessageLineBreakMode.Character: 文字単位で単純に折り返します。
縦方向の描画範囲を超えたときの挙動を設定します。既定値は MessageVerticalOverflowMode.ForceNext です。
MessageVerticalOverflowMode.Ignore: はみ出してもそのまま下へ描画します。MessageVerticalOverflowMode.ForceNext: 強制的に入力待ち状態へ入り、ページ送りを待ちます。MessageVerticalOverflowMode.ForceAutoNext: 強制的に時間指定付き入力待ち状態へ入り、自動でページ送りします。autoNextWaitMsが0の場合は自動送りを行わず、実質的にForceNext相当の待機になります。
メッセージの文字送り処理や待機時間の更新を行います。毎フレーム呼び出してください。
gameTime: ゲーム時間情報isInput: ページ送り/スキップ入力があった場合に true を渡します。
デフォルトの文字送り速度(1文字あたりの表示時間ms)を設定します(初期値=50ms)。
speedMs: 文字送り時間(ミリ秒)。小さいほど高速になります。
[var:key] タグで使用する文字列変数を設定します。Show または LoadScript を呼ぶ前に設定してください。
[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)が適用されます。[bgm:name]: 指定したBGMを再生します。[bgm:name,volume]で音量(0.0〜1.0)を指定できます。(例:[bgm:town,0.8])[bgmstop]: 再生中のBGMを停止します。[bgmstop:seconds]でフェード停止が可能です。(例:[bgmstop:1.5])
別名として[stopbgm],[bgm_stop]も利用できます。[se:name]: 指定したSEを再生します。[se:name,volume]で音量(0.0〜1.0)を指定できます。(例:[se:click,0.7])[event:ID]: イベントIDを発行します(GetEventで取得可能)。[blankline]: 空行を1つ挿入します。表示上の空行が必要な場合に使用します。[var:key]:SetVariable(key, value)で登録した文字列を展開します。未登録キーはnullに置き換わります。[input:mode]: ユーザー入力によるスキップ/ページ送りの有効無効を切り替えます。[input:disable]で無効化し、[input:enable]で再度有効化します。強制イベントシーンなどで使用します。
Sample Code
// In Initialize()
// Set position and size
Ton.Msg.SetWindowRect(20, 400, 600, 150);
Ton.Msg.SetLineBreakMode(MessageLineBreakMode.TokenAware);
Ton.Msg.SetVariable("Exp", "1200");
// Show Message Script
string script =
"Hello.[wait:500] This is [color:Red]Red Text[reset].\n" +
"Need EXP: [var:Exp]\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);
// If you want to draw Ton.Msg into your own render target
Ton.Msg.SetAutoDraw(false);
// 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!
// In Draw()
Ton.Gra.SetRenderTarget("message_layer");
Ton.Msg.Draw();
Ton.Gra.SetRenderTarget();
// 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
スクリプトファイル内では、行頭に # を付けることで複数のスクリプトを記述できます。
また、行頭に ; を付けるとコメント行となり、表示されません。
ラベルの使い方
- ラベルは
#ラベル名の形式で行頭に記述します。 LoadScript(filePath, scriptName)のscriptNameには、先頭の#を除いたラベル名を指定します。- 再生対象は「指定ラベル行の次行」から「次のラベル行の直前」までです。
- ラベルが見つからない場合はエラーメッセージを表示します。
改行と空行の扱い
- 改行コードは通常テキスト行の改行として扱われます。
- ウィンドウ幅を超える場合は自動改行されます。既定では
MessageLineBreakMode.TokenAwareが使用され、語や句読点を考慮して折り返します。 SetLineBreakMode(MessageLineBreakMode.Character)を指定すると、禁則を考慮しない単純な文字単位折り返しになります。- ウィンドウ高さを超えそうな場合は
SetVerticalOverflowBehaviorの設定に従います。既定では強制[next]相当の入力待ちへ入ります。 - 縦方向オーバーフロー判定は救済措置です。次行先頭の実際の描画要素高を厳密には先読みせず、現在スタイル基準でおおまかに判定します。
- 空行(改行コードのみの行)は表示上の空行としては扱われず、無視されます。
- 表示上の空行を入れたい場合は
[blankline]を使用します。 ;で始まる行はコメント行として完全に無視されます(表示にも改行カウントにも入りません)。
#Opening
; これはコメントです
[icon:Hero] こんにちは!
これはオープニングです。
[blankline]
[blankline]
[next]
#Ending
[icon:Hero] ありがとう!
また会いましょう。[next]
Sample Code
// Initialize
Ton.Msg.Initialize();
Ton.Msg.SetLineBreakMode(MessageLineBreakMode.TokenAware);
Ton.Msg.SetVariable("Exp", "1200");
// Load script from file (Play "Opening" section)
Ton.Msg.LoadScript("script/scenario.txt", "Opening");
// Manual Control
if (Ton.Input.IsJustPressed("A"))
{
Ton.Msg.Next();
}