ビットマップフォントを使う利点は
などがある。
難点は
がある。
ゲームではゲーム画面で使う数値とアルファベットと半角記号ぐらいを作っておくと便利。
ビットマップフォントの作成はShoeBox[1]が便利。他にもいろいろとある。
Starlingでの使い方は http://wiki.starling-framework.org/manual/displaying_text[2] こちらに紹介されているように、
[Embed(source="font.fnt", mimeType="application/octet-stream")] public static const FontXml:Class; [Embed(source = "font.png")] public static const FontTexture:Class; var texture:Texture = Texture.fromEmbeddedAsset(FontTexture); var xml:XML = XML(new FontXml()); TextField.registerBitmapFont(new BitmapFont(texture, xml));
のようにテクスチャと定義ファイルで初期化すると、あとは普通にTextField[3]でフォント名を指定すると使える。 このとき、指定するフォント名がビットマップフォントの定義xmlファイルにある「face」アトリビュートになることに注意が必要。 ShoeBox[1]だとデフォルトでこれがフルパスの画像ファイル名になるため、設定を変更するか編集しておかないと使い勝手が悪い。
しかし、このやり方より「StarlingのAssetManagerを使う[4]」で紹介したAssetManager[5]を使う方が、ロードと初期化をしてくれるので便利。
assets.enqueue(RESOURCE_DIR + "font.png"); assets.enqueue(RESOURCE_DIR + "font.fnt");
として、ロードするだけで、ビットマップフォントとしての初期化までしてくれるので、あとはフォント名を指定するだけでTextField[3]で使える。AsssetManager[6]については「StarlingのAssetManagerを使う[4]」を参照のこと。
しかし、この時はフォント名はxml内の「face」の値では無く、ファイル名(ここでは「font」)になることに注意が必要。
これでも使えるのだが、実際のゲーム開発では負荷を減らすためにドローコールを減らしたいが上のやり方ではビットマップフォントが別のテクスチャになってしまうのでその役には立たない。
それを実現するにはまず、ビットマップフォントを作成したら、そのテクスチャを他のテクスチャと統合し、あとでプログラム的にサブテクスチャを取り出せば良い。
まずxmlファイルの方はembedする。残念ながらAssetManager[5]を使うと、テクスチャ無しのビットマップ定義のみではエラーとなってxmlが取り出せない(取り出そうとするとnullが返る)のでembedするか自分でロードする必要がある。
[Embed(source="font.xml", mimeType="application/octet-stream")] public static const BmpFontXml:Class;
あとは、テクスチャアトラスに含まれるBitmapのテクスチャと共に初期化を行う。
TextField.registerBitmapFont(new BitmapFont(assets.getTexture(BMP_TEXTURE_NAME),XML(new BmpFontXml())));
ここでビットマップフォント以外も含まれているテクスチャアトラスの中から、ビットマップフォント部分をgetTextureで取り出している。
あとは、BitmapFont[7].createSpriteを使うとドローコールが減ると以下のページにあるのだが、やってみるとさほど減らない。謎。
http://forum.starling-framework.org/topic/performance-bitmap-fonts-draw-count[8]
数文字程度の場合、batchableをtrueにしておくとドローコールが減らせる。しかし、文字が多いとドローコールを減らすための処理が減らしたことによる負荷軽減を上回るそうなので、十数文字以下での利用が推奨されている。BitmapFont[7]のみの機能で通常のフォントによるTextField[3]では意味が無い。
textField.batchable = true;
(This host) = https://njf.jp