over 6 years ago

libGDX ではBitmapFontクラスを利用して任意のフォントで文字表示をおこなうことができる。確認できたBitmapFontクラスのインスタンスを生成する方法は二つ、FreeTypeFontGeneratorクラスから生成する方法、BitmapFontコンストラクタで生成する方法だ。違いは、動的か静的か。

FreeTypeFontGeneratorクラスから生成する方法

String font = "タッチしてゲームスト";
String message = "タッチしてゲームスタート";
FreeTypeFontGenerator generator = new FreeTypeFontGenerator( Gdx.files.internal("mikachan.ttf"));
BitmapFont bitmapFont = generator.generateFont(30, font, false);
generator.dispose();

generateFont の第2引数に与える文字列が message ではなくて、font であることに注意。generateFontはフォントを生成するためのものなので、文字列中に重複する文字があってはならない。フォントを用意できたら、下記のように目的の文字列を描写できる。

spriteBatch.begin();
float width = bitmapFont.getBounds(message).width;
bitmapFont.draw(spriteBatch, message, (800 / 2) - width / 2, 128);
spriteBatch.end();

文字が重複しない文字列を自動的に生成して、generateFont を呼びたい場合は、SimpleFontGeneratorのようなクラスを自前で用意する必要がある。

public class SimpleFontGenerator {
    private final FileHandle fileHandle;

    public SimpleFontGenerator(FileHandle fileHandle) {
        this.fileHandle = fileHandle;
    }

    public BitmapFont generateFont(int size, String characters, boolean flip) {
        if (characters.length() == 0) {
            return null;
        }

        String fonts = String.valueOf(characters.charAt(0));

        for (int i = 0; i < characters.length(); i++) {
            for (int j = 0; j < fonts.length(); j++) {
                if (fonts.charAt(j) == characters.charAt(i)) {
                    break;
                }
                if (j + 1 == fonts.length()) {
                    fonts = fonts.concat(String.valueOf(characters.charAt(i)));
                    break;
                }
            }
        }

        FreeTypeFontGenerator generator = new FreeTypeFontGenerator(fileHandle);
        BitmapFont font = generator.generateFont(size, fonts, false);
        generator.dispose();
        return font;
    }
}

恐らくバグだと思うが、特定のフォントサイズを generateFont に与えた場合、フォントと画像のマッピングがずれたような問題が発生するらしく、メッセージの描写がうまくいかないことがあった。もしこの問題に遭遇したらワンサイズ大きさを変えることで解決できだろう。

BitmapFontコンストラクタで生成する方法

この方法は、事前にAngelCode由来のBMFontフォーマットフォントデータを用意する必要がある。このフォーマットでフォントデータを作るツールは幾つかある。

Bitmap Font Generator はAngelCode純正で機能が充実しているが、Windowsでしか利用できない。TWL Theme Editor はフォントデータ作成専用ではないが、Windows以外のプラットフォームでも利用できる。hiero.jarもマルチプラットフォームで利用可能で、libGDXプロジェクトで提供されているツールだ。

hiero.jarは意図した文字を用意できないことがあったので、Windows 以外は TWL Theme Editor を使うほうがいいかもしれない。TWL Theme Editor でフォントデータを作る場合は、メニューから Tools > Create Font の順序で実行できる。

用意できたら、

bitmapFont = new BitmapFont(Gdx.files.internal("jpn.fnt"), Gdx.files.internal("jpn_00.png"), false);

でBitmapFontインスタンスを生成できる。

← libGDX - マルチスクリーン libGDX - スプライトとテクスチャアトラス →