文字表示

Irrlichtの文字表示機能

Irrlichtには文字表示機能が標準装備されているので、これを使いたい。
文字の書体は、標準で英文フォントがビルトインされており、何もせずとも使えるが、どうにか読める程度の解像度しかなく、日本語も使えないので、専らデバッグ用である。
日本語フォントは付属しないので、日本語表示するためには自分でフォントを用意する必要がある。フォントは独自のビットマップ形式フォントのみの対応なので、専用のFontToolを使って自分で生成する必要がある。
Irrlichtのフォント周りはUnicodeベース(UTF-16LEだがサロゲートペアは不可)の多言語対応であるため、無改造で日本語を表示できる。

FontToolについて

フォント作成にはFontToolが必要である。v1.8.4の時点では、二種類のFontToolが同梱されているが、old FontToolは多言語対応ではないので、new FontToolを使う必要がある。
しかし、new FontToolにはマルチバイト文字の扱いに関するバグがあり、このままでは日本語の文字の一部(ひらがなの「め」以降など)がフォント生成できない。
このため、最低でも、このバグを修正してFontToolをビルドする必要がある。
そこで、日本語での利用に耐えうる最低限の改良をしたFontToolを作成した。

日本語環境用FontTool

改良点は下記である。

  1. 前述のバグを修正。
  2. 日本語を含むフォント名が表示できるよう、表示に日本語フォント(VLゴシック)を使用するようにした。これに伴うGUIのレイアウト小変更。
  3. 生成する文字を絞り込めるようにした。日本語フォントの多くには膨大な数の文字があり、そのまま使うと過剰なメモリ消費となりかねないため。

絞り込みは、exeと同フォルダにフィルタファイル"FontTool-filter.txt"を置くと認識する。フィルタファイルはUTF-16LE(BOM付き)である必要がある。
フィルタファイル内の文字の並びは順不同かつ同文字の重複は無視されるので、極端な話、作品中で使うテキストを全部連結して詰め込んでも良い。ユーザの入力した文言を表示することのないアプリであれば、使う文字だけに絞り込むのも良い。
添付したサンプルのフィルタファイルの内容はASCII文字+旧JIS第1水準+αといったところ。

フォント生成の手順は下記の通り。

  1. CharsetにJapaneseを選択
  2. 画像化したいフォントを選択。先頭が"@"の物は縦書き用なので、選んではいけない。
  3. AA(アンチエイリアス)する場合はAlphaにもチェックを入れる。
  4. 出力はpngを選択する。
  5. 日本語フォントなら、画像サイズは256x256以上を推奨。

(注) ビットマップ化したフォントデータを組み込む際には、それが許されているかをライセンスを見て確認すること。筆者の知る限り、このような扱いを許可しているフォントは少ない。VLフォント推奨。

文字の表示

フォントのロードは下記のようにする。

gui::IGUIFont* gfFont16;
gfFont16 = pIrrDevice->getGUIEnvironment()->getFont("myfont.xml");

文字表示は下記のようにする。
beginScene()およびISceneManager::drawAll()以降、かつ、endScene()以前で行なうこと。

gfFont16->draw(L"ほげ", rect<s32>(100,100,0,0),video::SColor(255,255,255,255));

その他

標準GUI部品にはテキスト入力ボックスが含まれるが、これはIMEに対応していないため、日本語入力は出来ない。IMEを使いたい場合はIrrlichtMLなどを参考にして改造すべし。

デフォルトのフォントはエンジンにビルトインされており、BuiltInFont.h内のBuiltInFontData配列上にBMP形式で格納されている。

CGUIFontクラスには、文字の拡大/縮小機能は無い。このため、サイズ毎にフォントを用意する必要がある。


Copyright by MUTATE Systems 2018
管理者宛メール