文字列を表示するのに最適なオブジェクトは?
ただし文字表示については迷ったら積極的に妥協すべき
- 文字列を扱うための5つのオブジェクトと特徴について
日本語文字列を表示するためのオブジェクトは機能で見ると大まか二種類に分けられます。
- プレーンテキストを扱いこれを画像として出力する
- マルチスタイルテキストを扱いこれを出力する
「プレーンテキスト」というのは書式などが設定されていないテキスト(文字の整形情報が無い)=文字列です。文字列には通常フォントやフォントサイズ、文字色などの情報は含まれず、MMF2でプレーンテキストを扱うオブジェクトは各オブジェクトのプロパティや設定などを用いてフォントを決定したり後からサイズを変更したりできるようになっています。プレーンテキストは文字情報以外余計な情報が含まれないためだいたいデータ処理が軽くて描画も高速です。一方で部分的に文字列の色を変えたりサイズを変えたりという機能がありません。行間や文字間を変更する機能も無いので、この辺はMMF2を使う上で日本語表示にこだわりを捨てきれない人にはツライ内容となっています。
プレーンテキストを扱い文字列を描画できるオブジェクトは上の5つの中だと「文字列」「静的テキスト」「Surface」オブジェクトの3つ。
しかし「静的テキスト」はちょっと特殊な仕様を持っているので通常はエラーメッセージなどデバッグ用メッセージなどの出力・確認に用います。一番癖が無くて直感的な配置や設定が可能なのは基礎概念9でも登場した「文字列オブジェクト」。文字列の取り扱いに特化しているためデータ処理も速いし、通常はこれを使うのが合理的です。細かい設定はできませんがアンチエイリアス表示以外バグが無いのも安心して使える理由です。「Surface」は完全なユニコード対応がされていませんが本来グラフィック描画を扱うオブジェクトなので、かける手間と使い方次第では「文字列オブジェクト」よりも自由度のある表示指定ができます。エフェクトをかけなければそこそこ処理速度も速いです。そして複数の文字列を一つのオブジェクトで扱えます。文字列ごとにフォントサイズやカラー等の変更も設定できるので、力技を用いれば一文字ごとに色を変えサイズを変え位置指定を変えなどできます。これは同じ力技でも「文字列オブジェクト」を用いた力業を考えた場合より実用的だと思います。さらにMMF2の「なんちゃってアンチエイリアス?」ではなく描画された文字列にブラー効果をかけたり、ブラーをかけた後で透過色を指定すればスクリーンショットのような「袋文字」的な表現もできます。しかしこれはさすがに重い処理なので「Surface」を用いて凝ったことをすればPCの要求スペックがどんどん高くなっていきます。
上の例では文字列オブジェクトは三つ必要なのに対して、Surfaceなら一つで済む。ちなみにフォントによって描画結果は結構違う。同じ「文字列オブジェクト」を使ってもフォントによってこれだけ行間が詰まったり開いたり適切だったりするのだ。フォントによって結果がまちまちなのに対して「Surface」は行(あるいは任意の単語)ごとに文字色やサイズ、描画位置も細かく指定できる。むしろ問題はレンダリング品質がフォントによってかなり悪い。IPAのフリーフォントである「VLPゴシック」との相性の悪さは意外だった。この実験は文字位置指定や色・サイズ指定を手動でやったのだが、たぶんSurfaceとXLuaを組み合わせれば、XLuaにHTMLのようなタグ情報を読ませてタグ情報に沿って文字色、フォント指定、フォントサイズといった具合にSurfaceへテキスト描画をもっと細かく指示することができると思う。そしてそれらを関数化すればそこそこ実用的な速度でメッセージ表示できるんじゃないかなーという感じはした。でもフォントとの相性次第でレンダリング品質がこれだ・・・ちょっと厳しい。一応XLuaで簡単なサンプルができたので張っておきます。
必要なエクステンション
- Binary Object
- Surface
- XLua
●リッチエディットオブジェクトとフォーマットテキストオブジェクトについて
この二つは上記三つとは異なり本来プレーンテキストを扱うためのものではありません。これらはリッチテキストフォーマットというワープロソフトなどで標準的なRTF形式のドキュメントなどを扱うためのオブジェクトです。特に「フォーマットテキストオブジェクト」はあらかじめフォーマット(書式)設定が行われたドキュメントを扱うためのエクステンションです。これはインポートしたものを表示できるけど、インポートしたドキュメントの書式を変更する機能がほとんどありません。だからプレーンテキストなどをインポートしてもテキストファイルにはフォント情報やフォントサイズやフォント色などの指定は含まれていないのでこれらをインポートした後から変更はできないのです。つまり「フォーマットテキストオブジェクト」はテキストファイル(=書式設定されていないドキュメント)を扱うのにまったく向いていません。そして「リッチエディットオブジェクト」と連携させれば日本語文字列の表示は可能ですがこれは致命的に処理が重いです。さらにインポートしてもフォント指定が無視されている気がしますし、文字列の検索機能などにも確かバグがあったはずです。「リッチエディットオブジェクト」はワープロかと見間違うほど高機能ですが、仕様までワープロなのでほとんどの人がゲームに用いることをためらうはずだと思います。
●タグを使えるオブジェクトは無いの?
一番良いのはHTML書式のようなタグを用いたテキストをインポートできて、そのタグ情報に基づいた文字列のレンダリングができるエクステンションがあれば良いのですが、なぜかMMF2にはそのようなものが見当たりません。