Irrlichtには文字表示機能が標準装備されているので、これを使いたい。
文字の書体は、標準で英文フォントがビルトインされており、何もせずとも使えるが、どうにか読める程度の解像度しかなく、日本語も使えないので、専らデバッグ用である。
日本語フォントは付属しないので、日本語表示するためには自分でフォントを用意する必要がある。フォントは独自のビットマップ形式フォントのみの対応なので、専用のFontToolを使って自分で生成する必要がある。
Irrlichtのフォント周りはUnicodeベース(UTF-16LEだがサロゲートペアは不可)の多言語対応であるため、無改造で日本語を表示できる。
フォント作成にはFontToolが必要である。v1.8.4の時点では、二種類のFontToolが同梱されているが、old FontToolは多言語対応ではないので、new FontToolを使う必要がある。
しかし、new FontToolにはマルチバイト文字の扱いに関するバグがあり、このままでは日本語の文字の一部(ひらがなの「め」以降など)がフォント生成できない。
このため、最低でも、このバグを修正してFontToolをビルドする必要がある。
そこで、日本語での利用に耐えうる最低限の改良をしたFontToolを作成した。
改良点は下記である。
絞り込みは、exeと同フォルダにフィルタファイル"FontTool-filter.txt"を置くと認識する。フィルタファイルはUTF-16LE(BOM付き)である必要がある。
フィルタファイル内の文字の並びは順不同かつ同文字の重複は無視されるので、極端な話、作品中で使うテキストを全部連結して詰め込んでも良い。ユーザの入力した文言を表示することのないアプリであれば、使う文字だけに絞り込むのも良い。
添付したサンプルのフィルタファイルの内容はASCII文字+旧JIS第1水準+αといったところ。
フォント生成の手順は下記の通り。
(注) ビットマップ化したフォントデータを組み込む際には、それが許されているかをライセンスを見て確認すること。筆者の知る限り、このような扱いを許可しているフォントは少ない。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クラスには、文字の拡大/縮小機能は無い。このため、サイズ毎にフォントを用意する必要がある。