LWJGFont

LWJGFont は、LWJGL 上でお持ちのフォントを使って文字列を表示するためのライブラリです。

LWJGFont は、日本語などの英語以外の言語をビットマップフォントとして画面表示する際の課題を解決するために開発されました。
あらかじめ任意のフォントで任意のサイズの文字を PNG 画像としてマッピングし、
プログラム実行時には表示したい文章をその PNG 画像から自動で構築・画面表示することができます。

使用するフォントはテクスチャーとして読み込まれるので、
Java.awt.Font クラスを利用して動的にフォントの描画結果をテクスチャーに変換する方法よりも、高速なレンダリングを実現できます。

ダウンロード

リリースバージョン

各リリースバージョンでの更新履歴はこちらをご覧ください。

Maven から利用する

pom.xml に以下の設定を追記することで、Maven プロジェクトから LWJGFont をご利用いただけます。
<project>
...
  <dependencies>
...
    <dependency>
      <groupId>net.chocolapod</groupId>
      <artifactId>lwjgfont</artifactId>
    </dependency>
...
  <dependencies>
...
</project>

ただし、実際にプログラムからフォントを利用するには、事前にフォントのマッピング作業が必要になります。
詳細はチュートリアルをご覧ください。

ソースコード

LWJGFont のソースコードは GitHub にて公開しています。
機能拡張の要望などはこちらにて受け付けておりますが、対応できるかについての保証はいたしかねます。

LWJGFont のライセンスは MIT License です。
商用非商用を問わず、MIT ライセンスにのっとる限り、ご自由にお使いください。

チュートリアル

LWJGFont の仕組み

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

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

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

フォントを準備する

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

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

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

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

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

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

STEP 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 になります。

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

以上で、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 になりますので注意してください。

フォントを利用する

STEP 1.LWJGFont でフォントを変換して作られた jar ファイルを、開発するゲームの Java プロジェクトから使えるように classpath に追加します。
jar ファイルを classpath に追加する方法は、他のライブラリを classpath に追加する手順と同じです。

LWJGL のゲーム開発に Maven を使っている場合、pom.xml に以下の設定を追加してください。
<project>
...
  <dependencies>
...
    <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 をそれぞれ指定してください。

STEP 2.ゲームプログラムで文字列を表示します。
以下は、migu-1p-regular.ttf を LWJGFont で呼び出した場合の Java ソースコードです。
//  LWJGFont を呼び出す
LWJGFont    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 ファイルにも出力されますので後からも確認できます。
...
* 変換したフォントとクラスの対応表
    net.chocolapod.lwjgfont.example_demo.Migu1pRegularH28Font <- migu-1p-regular.ttf (Size: 28)
...
この例では migu-1p-regular.ttf(サイズ : 28)が Migu1pRegularH28Font クラスに変換されていることになります。

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

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

サンプルコード

以下は、migu-1p-regular.ttf を LWJGFont で表示するサンプルコードです。
import net.chocolapod.lwjgfont.mig1p.Migu1pRegularH28Font;
import net.chocolapod.lwjgfont.LWJGFont;
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 でフォントを読み込む
			LWJGFont	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();
	}
}
実行すると、以下のように画面上に緑色で文字列が表示されます。