見出し画像

MGL週報 #15 - テキストタグ機能の追加など

このエントリはゲーム開発用フレームワーク「MGL」の開発記録です.MGLは次のWebサイトにて無償で公開されています.

スクリーンショットを載せたいがために1日遅れの投稿となりましたが,テキストまわりの新機能を実装中です.

テキストタグ機能の追加

次のバージョン向けの新機能として,タグを使用したテキスト装飾機能を実装しています.仕様はまだ決めかねている部分もありますが,現時点でどのような感じになっているかをご紹介しましょう.

色指定

まずは基本中の基本,文字色の変更機能です.

文字色は"<#red>赤色</#>"のように指定します."<#red>"の部分が色変更のタグで,"</#>"が色の変更をリセットするタグです.

文字色の種類は以前にも紹介したxterm-256カラーの名前を小文字で指定します.

実際の使用方法は次のような感じです.

font.Print("<#red>MGL</> stands for <#red>M</>GL <#red>G</>ame <#red>L</>ibrary.");
font.Print("<#green>MGL</>は <#green>M</>GL <#green>G</>ame <#green>L</>ibraryの略です.");

font.SetMaskColor(MGL::XColor::C412);
font.Print("文字全体の色を変えても<#c141>タグの指定色が優先</>されます.");
実行結果(1280x720)

ここでは終了タグに"</>"を使用していますが,これは全てのタグの効果をリセットするという意味です.

効果としてはマスクカラーを指定した色で上書きするという内容になっています.そのため,3行目のようにプログラム側でマスクカラーを指定していたとしても,タグによる文字色が優先的に使用されます.

書体指定

次期バージョンの大きな変更点として,1つのフォントリソースが複数の書体を持てるようになります.これに伴い,フォント生成ツールのmgl-font2texにもアップデートを加えると同時に,現バージョンのバイナリフォーマットとの互換性も失われる予定です.これを機に新バイナリフォーマットはチャンク方式にしたため,今後の拡張は柔軟に対応できるはずです.

書体を複数持つ理由は後述のルビ機能のためのものでしたが,タグから書体を指定して表示する機能もついでに追加しました.

使用方法は次のような感じです.

font.Print("例えば<$bold>強調表示</>を行いたい場合に利用可能です.");
font.Print("<#red><$bold>色変更</>と併用するとより効果的です.");
実行結果(1280x720)

現時点ではこの機能はボールド体のみに対応しています.タグやフォントリソース側の仕様では任意の書体名が使えるのですが,中間表現であるインデックス文字列が2バイト固定長な関係で最大256種類の書体タイプを定義しなければならないためです.つまり,よく使いそうな書体をリストアップする必要があり,それを挙げるときりがないためどうしようかな? というところです.他によく使われるものはイタリック体くらいですが,これを活用しているゲームはちょっと思い付かないのですよね.

また,欲を言えば,書体を指定するのではなく,意味論的なタグを指定して対応した書体を表示するようにしたいところです.今回の例で言えば,「強調表示したい→ボールド体を指定→ボールド体で表示」ではなく,「強調表示を指定→ボールド体で表示」という流れが理想的.ただ,意味と書体をどのように関連付けるかというルールと仕組みも必要になってくるため,やるのなら今後の拡張対応という形になります.

ルビ(振り仮名)

今回どうしても入れたかった機能です.わざわざバイナリフォーマットの互換性を犠牲にしてまで複数の書体を持てるように対応したのも,このルビの実装が目的です.

別に無くても困らないけど,あれば積極的に使いたい機能,それがルビです.日本以外ではほとんど使われることがないらしく,需要が少ないせいか,これに対応したシステムもあまり多いという印象はありません.

ルビのタグの記法はちょっと特殊で,"<@親文字:ルビ文字>"という書式になります.終了タグは使用せず,区切り文字に':'または'='を用います.

区切り文字の違いは,ルビ文字の幅が親文字を超えた場合に幅を調整するか否かの効果が異なります.':'を指定した場合は幅を調整せず,'='を指定した場合は親文字側の幅をルビ文字に合わせて調整してくれます.

百聞は一見に如かず,実際の使用例は次の通りです.

font.Print("だが その<@彫刻:エングレーブ>は何の<@戦術的優位性:タクティカルアドバンテージ>もない");
font.Print("だが その<@彫刻=エングレーブ>は何の<@戦術的優位性=タクティカルアドバンテージ>もない");
実行結果(1280x720)

上が':'を指定した幅調整を行わない指定で,下が'='を指定した幅調整ありの指定です.ルビ文字の幅が親文字を超える例が他に思い浮かばなかったため,コナミの名作「メタルギア ソリッド3」の名言を引用しています.ちなみに,ゲーム中の該当シーンの字幕は上の幅調整を行わない表示になっていました.

下の幅調整を行う表示は場合によっては不恰好になりますが,隣接する他のルビ文字と表示が重ならないというメリットがあります.多くのWebブラウザではこちらの表示方式になっているようです.

ゲームにおけるルビ機能は,任天堂タイトルのように年齢層を問わず楽しめるゲームには積極的に採用されている他,世界観を彩るための表現としても活用できる便利な機能です.ニッチで無機的なゲームばかり作っている私には使う機会がありませんでしたが,きっと便利です.多分.

次期バージョンの公開時期

……は未定です.この文字表示関連の作業が一段落したら公開するつもりですが,それがいつになるかは不明です.

現時点ではようやく画面に表示できるようになった段階であり,ここから動作チェックや仕様の再確認,ソースコードの整理などを行う必要があります.また,関連するツール類とエクステンションの更新も必要です.もちろん,ドキュメントの更新も必要です.作業が多い……

今週中は無理ですが,来週か再来週にはリリースしたいところです.MGLの開発に専念できるほどの余裕は無いものの,これが片付かないとMGL関連の他の作業も進められず,それはそれで困りものですからね.

その他

記事中にもある通り,私自身はニッチで無機的なゲームを好んで作っていますが,たまにはキャラクターが飛んだり跳ねたりするゲームも作りたい気持ちはあるんですよね.ここで紹介したタグ機能をフル活用したテキストなんかも交えたりして.ただ,私のセンスで作ると間違いなく奇ゲーと呼ばれる類のものになる気がします.

いいなと思ったら応援しよう!