2013年10月30日水曜日

#6 libGDX - 日本語の表示 (FreeTypeFontGenerator)

LibGDXで日本語表示を試してみました。
参考になるページがあまりなく四苦八苦でしたが(汗
基本的には、CREATE BITMAPSFONTS ON THE FLY WITH GDX-FREETYPE
で紹介されている方法と一緒です。

サンプルに実行結果




独自のフォントを使う場合は、プロジェクトに別途 jarファイルの追加が必要です。

・coreプロジェクト
 libgdx-0.x.x/extensions/gdx-freetype/gdx-freetype.jar
 を、libsディレクトリーへコピーしビルドパスを通す。

・desktopプロジェクト
 libgdx-0.x.x/extensions/gdx-freetype/gdx-freetype-natives.jar
 を、libsディレクトリーへコピーしビルドパスを通す。

・androidプロジェクト
 libgdx-0.x.x/extensions/gdx-freetype/gdx-freetype.jar
 libgdx-0.x.x/extensions/gdx-freetype/armeabi/libgdx-freetype.so
 libgdx-0.x.x/extensions/gdx-freetype/armeabi-v7a/libgdx-freetype.so
 を、libsディレクトリーへコピー

アプリで使いたいフォントファイル(.ttf)を assetsディレクトリにコピーして使いたいところでしたが、assetsディレクトリーはサイズ上限があり、日本語フォントファイルをzip圧縮してassetsディレクトリー
に配置しました。。。が。。。それでも、端末によってはうまく読み込めないので今回は、 classpath の通ったディレクトリにzipファイルを配置しました。

libGDXでzipファイルを扱うためのクラスがなさげだったので、以下のようなzipファイルを読み込むためのクラスを用意しました。

ZipFileHandle.java
package com.me.mygdxgame;

import java.io.IOException;
import java.io.InputStream;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import com.badlogic.gdx.Files.FileType;
import com.badlogic.gdx.files.FileHandle;

public class ZipFileHandle extends FileHandle {

	private ZipInputStream zis;
	private ZipEntry nextEntry;

	public ZipFileHandle(String zipFileName, String entryFileName, FileType type) {

		super(zipFileName, type);

		zis = new ZipInputStream(super.read());

		try {
			while (null != (nextEntry = zis.getNextEntry())) {
				if (nextEntry.getName().equals(entryFileName)) {
					break;
				}
			}
		} catch (IOException e) {
			throw new RuntimeException(e);
		}

	}

	@Override
	public InputStream read() {
		return zis;
	}

	@Override
	public long length() {

		if (nextEntry == null) {
			return 0;
		}

		return nextEntry.getSize();
	}
}


FileHandleクラスを継承しているので、以下のようにして FreeTypeFontGenerator で使うことができました。以下のようにFreeTypeFontGeneratorで生成したいBitmapFont を生成することができます。

例)FreeTypeFontGeneratorクラスの使用例

	// BitmapFont生成
	FreeTypeFontGenerator generator = new FreeTypeFontGenerator(
			new ZipFileHandle("font/yasashisa.zip", "yasashisa.ttf",
					FileType.Classpath));

	bitmapFont = generator.generateFont(18, "あいうえお", false);

	generator.dispose();



FreeTypeFontGenerator#generateFontの第2引数は、文字がユニークになるように設定しないと実行時に例外が発生します。

以下のように、BitmapFont#draw で文字列を描画できます。

例)文字列の描画
	@Override
	public void render() {

		Gdx.gl.glClearColor(1, 1, 1, 1);
		Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

		// 描画
		batch.setProjectionMatrix(camera.combined);

		batch.enableBlending();
		batch.begin();

		bitmapFont.setColor(0, 0, 0, 1);
		bitmapFont.setScale(1.0f);

		bitmapFont.draw(batch, "あいうえお", 10, 100);

		batch.end();

	}

参考ページ:http://www.badlogicgames.com/wordpress/?p=2300
サンプルで使用させていただいたフォント:やさしさゴシック

サンプルソースのダウンロード

0 件のコメント:

コメントを投稿