libGdxで任意のフォント(ttf)を使って日本語を表示する方法

ある日ゲームの中で日本語表示させたいー。ってなった。

前提

・いくつか方法はあるみたいなのですが,FreeTypeFontGeneratorを使う方法です。

・記事投稿現在最新の1.6.1のlibgdxを使用しています。

・内容はまんまここ↓の Other Tools の内容っすね

https://github.com/libgdx/libgdx/wiki/Bitmap-fonts

フォントを用意

www.flopdesign.com

今回はハン丸ゴシックというフォントをお借りしています。

かわいいこと山のごとし。

gdx-freetype-natives.jar, gdx-freetype.jar が必要

今回使ったFreeTypeFontGeneratorはこのjarにいる。

このjarは、extensions/gdx-freetype のディレクトリの配下にいる。

なのでこのjarをパス通しておく必要があります。

使い方

/**
 * Labelで任意のフォントをFreeTypeFontGeneratorで読み込んで日本語を表示するサンプル
 */
public class FreeTypeFontGeneratorSampleListener extends ApplicationAdapter {

    private Stage stage = null;

    @Override
    public void create() {
        stage = new Stage();
        Gdx.input.setInputProcessor(stage);
        
        FreeTypeFontGenerator generator =
                new FreeTypeFontGenerator( Gdx.files.internal("font/" + "HanmaruGothic.ttf"));  //(1)

        FreeTypeFontGenerator.FreeTypeFontParameter parameter =
                new FreeTypeFontGenerator.FreeTypeFontParameter();    //(2)

        parameter.size = 24;
        parameter.borderColor = Color.PURPLE;
        parameter.borderWidth = 2;
        parameter.characters = "あいうえおかきくけこさしすせそたちつてとはひふへほ";    //(3)
        parameter.characters += FreeTypeFontGenerator.DEFAULT_CHARS;
        BitmapFont font = generator.generateFont(parameter);    //(4)

        Label.LabelStyle labelStyle = new Label.LabelStyle(font, Color.WHITE);//(5)
        Label label = new Label( "こんにちは", labelStyle );
        label.setPosition( 200, 300 );

        stage.addActor( label );
    }

    @Override
    public void render() {
        Gdx.gl.glClearColor(1, 0, 0, 1);
        Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);    //画面クリア

        stage.draw();
    }
}

・(1)でフォントファイル読み込みます。

・(2)FreeTypeFontParameter というクラスで文字色などを設定出来ます

・(3)FreeTypeFontParameter#character に表示したい文字で使う文字を渡してあげます。

これをやらない場合は、クラスみれば一発ですが、デフォルトでアルファベットなどが指定されています。

日本語を表示したい場合は、ここに日本語を指定してあげる必要ありです。

上のようにベタで書かずに文字コードとかでいけないかなーと思っているんですが・・うまくいかない;

・(4)BitmapFont インスタンスを作ります。

これであとは、BitmapFontで描画できる。

・(5)自分はよく直接Sprite使ってなくてscene2dを使っているんで、

com.badlogic.gdx.scenes.scene2d.ui.Labelを使った方が都合がよいでLabelを使う方法で。

LabelもActorなので、stage#addActorしてあげればよい。

表示結果

f:id:snoopopo:20150918183515p:plain

かわいいフォントで文字が出ましたー

「こんにちは」を渡しているのに、「こちは」しか出ていないのは、(3)のFreeTypeFontParameter#character に「ん」と「に」を渡していないからです。

とくにエラーも出ずに、ただ表示されないだけになります。