Rendering Chinese Text in LibGDX
LibGDX's default text rendering relies on the BitmapFont class, which uses pre-generated font atlases. The default constructor loads:
public BitmapFont() {
this(Gdx.files.classpath("com/badlogic/gdx/utils/arial-15.fnt"),
Gdx.files.classpath("com/badlogic/gdx/utils/arial-15.png"), false, true);
}
The FNT file defines character metrics while PNG contains glyph textures.
Font Atlas Structure
FNT files contain:
- Metadata (face, size, Unicode stetings)
- Character definitions (ID, position/size in atlas, offsets)
- Kerning pairs (adjustments between specific character combinations) Example snippet:
char id=251 x=34 y=0 width=9 height=19 xoffset=1 yoffset=0 xadvance=8
kerning first=89 second=44 amount=-2
Implementing Chinese Support
Since default fonts lack CJK glyphs, generate custom font atlases:
-
Use Hiero or similar tools:
- Select Unicode-compatible font
- Add required Chinese chraacters
- Export as BMFont files (.fnt + .png)
-
Load custom atlas:
// After placing files in assets/
BitmapFont chineseFont = new BitmapFont(
Gdx.files.internal("custom_chinese.fnt"),
Gdx.files.internal("custom_chinese.png"),
false
);
- Render text:
SpriteBatch batch = new SpriteBatch();
// Single line
chineseFont.draw(batch, "FPS: " + Gdx.graphics.getFramesPerSecond(), 10, 30);
chineseFont.draw(batch, "祝大家光棍节快乐", 10, Gdx.graphics.getHeight()/2);
// Multi-line
String message = "第一行\n第二行";
chineseFont.drawMultiLine(batch, message, 10, 100);
Multi-line Rendering
Use overloaded methods:
// Basic multi-line
font.drawMultiLine(batch, text, x, y);
// With alignment constraints
font.drawMultiLine(batch, text, x, y, maxWidth, HAlignment.CENTER);