LWJGFont

このチュートリアルは LWJGFont ver 1.0 用です。最新版についてはこちらをご覧ください。

チュートリアル

LWJGFont の仕組み

LWJGFont は、LWJGL で任意のフォントをビットマップフォントとして利用するためのフレームワークです。

LWJGL から任意のフォントを使って文字列を表示するためのクラスと、そのフォントをマッピングした画像リソースをまとめて jar ファイルにパッケージすることができます。 実際のゲーム開発では、LWJGFont と LWJGFont によって生成された jar ファイルを利用することで、簡単に文字列を表示することができます。

LWJGLFont にはフォント自体は含まれませんので、あらかじめご自身で利用するフォントをご用意ください。

フォントを準備する

LWJFont を利用するためには、まず LWJGL で表示したいフォントをビットマップフォントとして利用するために jar ファイルに変換します。

1. 利用したいフォントを用意してください。
このチュートリアルでは、例として M と IPA の合成フォントMigu 1P フォント を利用します。
migu-1p-20130617.zip を展開して、任意のディレクトリに migu-1p-regular.ttf を置いたものとします。

2. 次に、LWJGFont の最新版をダウンロードし、同じディレクトリの中に置きます。ここでは lwjgfont-1.0.jar をダウンロードしたものとします。

3. LWJGFont で利用する文字を設定します。
Windows ではコマンドプロンプトを、Linux / MaxOSX ではターミナルを起動し、以下のコマンドを実行してください。
> cd path/to/dir
> java -jar lwjgfont-1.0.jar -x
path/to/dir は migu-1p-regular.ttf と lwjgfont-1.0.jar を置いたディレクトリのパスに読み替えてください。

また、java コマンドは Java Runtime Environment に含まれるものではなく、必ず Java SE Development Kit に含まれる java コマンドを使用してください。JRE の java コマンドでは Java ソースコードをコンパイルするための Java Compiler API を利用できないため、実行時にエラーが発生します。

-x オプションを利用することで、characters ディレクトリが作られ、内部に LWJGFont で表示する文字を記載したテキストファイルが配置されます。
これにはアルファベットと半角記号に加え、ひらがな、カタカナ、全角記号、常用漢字が記載されています。この他に表示したい文字があれば、テキストファイルに書き加えるか、新しくテキストファイルを作って characters ディレクトリの中に置いてください。
このテキストファイルは文字コードを UTF8 としてください。

4. フォントから変換される jar ファイルのファイル名とバージョンを設定します。
LWJGFont を置いたディレクトリ内に、以下の内容を記載した lwjgfont.properties というファイルを作成してください。
artifact.name=mig1p
artifact.version=1.0
artifact.name はフォントを変換して生成される jar ファイルのパッケージ名、artifact.version は jar ファイルのバージョンになります。
この設定の場合、mig1p-1.0.jar という jar ファイルが作られます。

設定を省略した場合、artifact.name は myfont、artifact.version は 1.0-SNAPSHOT になります。

5. フォントを jar ファイルに変換します。
先ほどと同じように、コマンドラインから以下のコマンドを実行してください。
> java -Dfile.encoding=UTF8 -jar lwjgfont-1.0.jar migu-1p-regular.ttf:28
引数には 変換するフォントのファイル名:フォントのサイズ を指定します。
この場合、migu-1p-regular.ttf をサイズ 28 で使える形で jar ファイルに変換し、mig1p-1.0.jar というファイルが作られます。

この時、java コマンドの引数に -Dfile.encoding=UTF8 を指定してください。-Dfile.encoding はファイル入出力をする際の文字コードを指定するオプションです。LWJGFont が動的に生成するクラスは UTF8 で動的にコンパイルされるため、自動生成するソースコードも UTF8 で出力する必要があります。

以上で、LWJGFont でのフォントの準備はおわりです。
この作業は LWJGL で使いたいフォントとフォントのサイズが変わらない限り、再度行う必要はありません。

LWJGL のゲーム開発に Maven を使っている場合、以下のコマンドで変換した jar ファイルをローカルリポジトリにインストールすることができます。
> mvn install:install-file -Dfile=mig1p-1.0.jar \
-DgroupId=net.chocolapod.lwjgfont -DartifactId=mig1p -Dversion=1.0 -Dpackaging=jar -DgeneratePom=true
LWJGFont によって変換される jar ファイルは、artifactId が lwjgfont.properties に指定した artifact.name の値、version が lwjgfont.properties に指定した artifact.version の値になります。
ただし、groupId は net.chocolapod.lwjgfont になりますので注意してください。

フォントを利用する

LWJGFont を使って実際に文字列を表示するには、まず LWJGFont と LWJGFont でフォントを変換して作られた jar ファイルを、開発するゲームの Java プロジェクトから使えるように classpath に追加します。

LWJGL のゲーム開発に Maven を使っている場合、pom.xml に以下の設定を追加してください。
<project>
...
  <dependencies>
...
    <dependency>
      <groupId>net.chocolapod</groupId>
      <artifactId>lwjgfont</artifactId>
    </dependency>
    <dependency>
      <groupId>net.chocolapod.lwjgfont</groupId>
      <artifactId>mig1p</artifactId>
      <version>1.0</version>
    </dependency>
...
  <dependencies>
...
</project>

上記の設定は LWJGFont でフォントを変換したファイルが mig1p-1.0.jar の場合の例です。
artifactId と version には、変換時に lwjgfont.properties に記載した artifact.name、artifact.version をそれぞれ指定してください。
また、LWJGFont で生成した jar ファイルの他に、LWJGFont も必要になりますので、忘れずに指定してください。

それでは LWJGL から実際に文字列を表示してみます。
以下は、migu-1p-regular.ttf を LWJGFont で呼び出した場合の Java ソースコードです。
//  LWJGFont を呼び出す
Migu1pRegularH28Font    font = new Migu1pRegularH28Font();
//  フォントの色を設定する
font.setColor(0f, 1f, 0f);
//  LWJGFont で文字列を表示する
font.drawString("ハロー☆LWJGFont", 50, 200, 0);
LWJGFont は変換したフォント毎に、そのフォントを利用するためのクラスを自動生成します。
この呼び出し用のクラスのクラス名は、変換したフォントのファイル名とサイズに対応します。これは、フォントのファイル名を英数字以外で区切って、先頭の 1 字のみ大文字にしたものです。末尾には 'H' + フォントのサイズ + 'Font' がつきます。
このチュートリアルでは migu-1p-regular.ttf をサイズ 28 で変換しているので、Migu1pRegularH28Font となります。

呼び出し用のクラスとフォントファイルの対応は、LWJGFont でフォントを jar ファイルに変換する際に lwjgfont.log ファイルにも出力されます。

呼び出し用のクラスの setColor(float red, float blue, float green) は、文字列を表示する際の色を RGB 値で指定します。RGB の各値は、LWJGL の GL11.glColor3f()に指定するものと同じく 0f ~ 1f の間で指定します。デフォルトでは白(red = 1, blue = 1, green = 1)が設定されています。

drawString(String text, float dstX, float dstY, float dstZ) が、文字列を表示するメソッドです。第 1 引数 text には表示したい文字列を、第 2 〜第 4 引数には文字列を表示する座標を指定します。

以下は、migu-1p-regular.ttf を LWJGFont で表示するサンプルコードです。
import net.chocolapod.lwjgfont.mig1p.Migu1pRegularH28Font;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GL11;

public class LwjgfontExample {

	public void start() {
		try {
			//  ウインドウを生成する
			Display.setDisplayMode(new DisplayMode(400, 300));
			Display.create();
		} catch(LWJGLException e) {
			e.printStackTrace();
			return;
		}

		try {
			//  OpenGL の初期設定

			//  テクスチャーを有効化する
			GL11.glEnable(GL11.GL_TEXTURE_2D);

			GL11.glMatrixMode(GL11.GL_PROJECTION);
			GL11.glLoadIdentity();
			GL11.glOrtho(0, 400, 0, 300, 0, 100);
			GL11.glMatrixMode(GL11.GL_MODELVIEW);

			//	LWJGFont でフォントを読み込む
			Migu1pRegularH28Font	font = new Migu1pRegularH28Font();
			
			//	フォントの色を設定する
			font.setColor(0f, 1f, 0f);

			while (!Display.isCloseRequested()) {
				GL11.glClear(GL11.GL_COLOR_BUFFER_BIT);

				//	LWJGFont で文字列を表示する
				font.drawString("ハロー☆LWJGFont", 50, 200, 0);

				Display.update();
			}
		} catch(Exception e) {
			e.printStackTrace();
		} finally {
			Display.destroy();
		}
	}

	public static void main(String[] args) {
		new LwjgfontExample().start();
	}
}
実行すると、以下のように画面上に緑色で文字列が表示されます。