Q. 文字列を半透明で表示できますか?
文字列を表示する前に net.chocolapod.lwjgfont.LWJGFont クラスの setAlpha(float alpha) を呼び出すことで、それ移行の文字列表示で適用されるアルファ値を設定することができます。アルファ値には 0f 〜 1f の範囲の不透明度を渡すことができ、大きい値ほど不透明になります。
// LWJGFont でフォントを読み込む
LWJGFont font = new SampleH32Font();
// LWJGFont の不透明度を設定する
font.setAlpha(0.4f);
// LWJGFont で文字列を表示する
font.drawString("不透明度 40 % で文字列を表示する", 10, 10, 0);
対象バージョン: LWJGFont ver 1.0 〜
Q. 文字列を折り返し表示できますか?
文字列を表示する時に、net.chocolapod.lwjgfont.LWJGFont クラスの drawString(String text, float dstX, float dstY, float dstZ) のかわりに drawParagraph(String text, float dstX, float dstY, float dstZ, float paragraphWidth) を呼び出すことで、第 1 引数 text の文字列を文章の段落として表示することができます。第 5 引数 paragraphWidth は段落の横幅で、表示する文字列がこの横幅に収まりきらない場合には自動的に改行されます。
// LWJGFont でフォントを読み込む
LWJGFont font = new SampleH32Font();
// LWJGFont で文字列を指定幅で折り返し表示する
font.drawParagraph("長い文章を段落として表示する。この時、表示する文章が段落の横幅におさまりきらない場合、" +
"残りの文章は自動的に折り返されて次の行に表示される。", 10, 10, 0, 200);
対象バージョン: LWJGFont ver 1.0 〜
Q. 文字列を右詰め/中央寄せで表示できますか?
文字列を段落として表示するための net.chocolapod.lwjgfont.LWJGFont.drawParagraph(String[] texts, float dstX, float dstY, float dstZ, float paragraphWidth, ALIGN align) は、第 6 引数として文字列の表示方向を指定することができます。この引数の型は net.chocolapod.lwjgfont.LWJGFont.ALIGN で、文字列の表示方向を表す enum です。enum 定数には LEFT、RIGHT、CENTER があり、指定すると、表示する文字列は段落の横幅内でそれぞれ左寄せ、右寄せ、中央揃えになります。
// LWJGFont でフォントを読み込む
LWJGFont font = new SampleH32Font();
// LWJGFont で文字列を右詰めで折り返し表示する
font.drawParagraph("文字列を段落として表示するときには、段落内での文字列の表示位置を" +
"右詰めや中央揃えにすることもできる。", 10, 10, 0, 200, LWJGFont.ALIGN.RIGHT);
対象バージョン: LWJGFont ver 1.0 〜
Q. 文字列の表示幅がわかりますか?
net.chocolapod.lwjgfont.LWJGFont クラスの stringWidth(String text) を呼び出すことで、第 1 引数 text として指定した文字列を表示するために必要となる幅を調べることができます。このメソッドは表示領域を計算するだけで、文字列の表示処理はしません。
等幅フォントはすべての文字が一定の横幅で表示されるため、文字列の字数をかけることで表示幅を計算することができます。しかし、プロポーショナルフォントは文字ごとに表示幅が異なるため、文字列全体の横幅を調べることは容易ではありません。LWJGFont はフォントを変換する際に各文字の表示幅を記録しておくため、プロポーショナルフォントでも簡単に表示幅を調べることができます。
// LWJGFont でフォントを読み込む
LWJGFont font = new SampleH32Font();
// 文字列の表示幅を取得する
int stringWidth = font.stringWidth("任意の文字列の表示幅を計算する");
対象バージョン: LWJGFont ver 1.0 〜
Q. 表示できる文字を変更することはできますか?
LWJGFont でフォントを jar ファイルに変換する際に、characters ディレクトリ内の .txt ファイルに利用したい文字を書くと、LWJGL 側でその文字を表示することができるようになります。characters ディレクトリは、最初に LWJGFont に -x オプションを指定して実行する際に自動生成され、ディレクトリ内にはひらがな・カタカナ・英数字・常用漢字が記載されたテキストファイルが配置されています。表示したい文字を追加・変更する場合には、characters ディレクトリ内のテキストファイルに追記するか、新しいテキストファイルとして保存してください。拡張子が .txt であり、文字コードが UTF8 であれば、ファイル名やファイルの書式に制限はありません。
ただし、表示対象の文字を変更した後には再度 jar ファイルへの変換を行わなければならないことに注意してください。
// カレントディレクトリに characters ディレクトリと、デフォルトで表示対象となる文字を記載したテキストファイルを生成する。
> java -jar lwjgfont-1.1.jar -x
// ここで、characters ディレクトリ内のテキストファイルを修正・追加し、
// 表示したい文字を変更する
// characters ディレクトリ内のテキストファイルの文字を表示対象として、フォントを jar ファイルに変換する
> java -jar lwjgfont-1.1.jar sample.ttf:20
デフォルトで生成されるテキストファイルには、それぞれ以下の表示対象の文字が記載されています。
alphabet.txt | …… 半角アルファベット |
symbol.txt | …… 記号 |
kana.txt | …… ひらがな、カタカナ |
kanji.txt | …… 常用漢字 |
kanji_extra.txt | …… その他の表示対象となる漢字。LWJGFont のバージョンアップによって追加されていく可能性があります。 |
また、表示したい文字が限られている場合には、不要な文字を削除することで、返還後の jar ファイルをある程度小さくすることができます。例えば、ひらがな・カタカナだけ使えればいいという場合には、kana.txt 以外のテキストファイルを削除してかまいません。
対象バージョン: LWJGFont ver 1.0 〜
Q. Slick2D で利用することはできますか?
公式に動作確認をしているわけではありませんが、Slick2D は LWJGL をベースとしたフレームワークなので利用することができます。他の LWJGL ベースのフレームワークも同様です。
ただし、フレームワークによっては LWJGL の初期化処理などに特徴があるため、それを踏まえた上でうまくご利用ください。例えば
Slick2D では文字列の上下が反転して表示されるため、LWJGFont で文字列表示する時のみ、あらかじめ glTranslatef() で回転しておくなどする必要があります。
対象バージョン: LWJGFont ver 1.0 〜
Q. 一部の文字が ■ と表示されしまいます。
LWJGFont でフォントを jar ファイルに変換する時に、表示対象として指定されなかった文字を表示しようとすると、■ と表示されます。表示したい文字を characters ディレクトリ内のテキストファイルに追記し、再度 jar ファイルへの変換を行ってください。
参考:
Q. 表示できる文字を変更することはできますか?
なお、文字を表示対象として指定しても、フォント自体に含まれていない文字は正しく表示できません。
対象バージョン: LWJGFont ver 1.0 〜
Q. Slick2D で文字列を表示すると上下が反転してしまいます。
Slick2D 特有の座標系設定によるものです。Slick2D では Y 座標が大きいほど画面の下に表示されるよう座標系が設定されています。しかし LWJGFont は Y 座標が大きいほど画面上に表示されることを前提とし、表示する文字列の下端の座標 < 上端の座標 となるよう表示処理を行います。このため Y 軸方向に逆転して表示される結果となります。
回避策として、LWJGFont で文字列を表示する時のみ、Y 軸方向に 180 度回転させた上で表示処理をおこなってください。
以下は Slick2D で LWJGFont を利用する例です。drawStringWithLWJGFont() にて LWJGFont を使った文字列表示を行っています。
import java.io.IOException;
import net.chocolapod.lwjgfont.LWJGFont;
import net.chocolapod.lwjgfont.example_demo.Migu1pRegularH45Font;
import org.newdawn.slick.AppGameContainer;
import org.newdawn.slick.BasicGame;
import org.newdawn.slick.GameContainer;
import org.newdawn.slick.Graphics;
import org.newdawn.slick.SlickException;
import org.newdawn.slick.opengl.renderer.Renderer;
public class LWJGFontOnSlick2D extends BasicGame {
//フォントの読み込み
private LWJGFont font = new Migu1pRegularH45Font();
public LWJGFontOnSlick2D() {
super("タイトル");
}
//描画処理
public void render(GameContainer arg0, Graphics g) throws SlickException {
try {
drawStringWithLWJGFont(g, "LWJGFont で文字列を表示する", 100, 100);
// font.drawString("Slick2D で文字列を表示する", 100, 100, 0);
} catch (IOException e) { e.printStackTrace(); }
}
/**
* Slick2D ではデフォルトで画面左上が原点となるが、
* LWJGFont ver1.1 ではデフォルトで画面左下が原点となるよう glOrtho が呼ばれる。
* なので、LWJGFont で文字列表示する際には X 軸を中心に 180 度回転させた上で表示を行う。
*/
public void drawStringWithLWJGFont(Graphics g, String text, int x, int y) throws IOException {
// 移動・回転を行うため、行列スタックに現在の行列を退避させる
g.pushTransform();
// 原点(回転の中心点)を文字列の表示位置に移動する
Renderer.get().glTranslatef(x, y + (font.getLineHeight() / 2), 0);
// 原点を通る X 軸を中心に 180 度回転させ、Y 座標の方向を逆転させる
Renderer.get().glRotatef(180, 1, 0, 0);
// 原点に LWJGFont で文字列を表示する
font.drawString(text, 0, 0, 0);
// 行列スタックからもとの行列を取り出し、移動・回転前の状態に戻す
g.popTransform();
}
public void init(GameContainer arg0) throws SlickException {
// 初期処理
}
public void update(GameContainer arg0, int arg1) throws SlickException {
// 更新処理
}
public static void main(String[] args) throws SlickException{
AppGameContainer app = new AppGameContainer(new LWJGFontOnSlick2D());
app.setTargetFrameRate(60);
app.setDisplayMode(640,480,false);
app.start();
}
}
対象バージョン: LWJGFont ver 1.0 〜