我喜欢在我的应用程序中打印中文文本。
1.当我尝试这个时,屏幕将为空。控制台没有错误。
创建方法:
FreeTypeFontGenerator gen = new FreeTypeFontGenerator(Gdx.files.internal("fonts/DFLS1B.TTF"));
font = gen.generateFont(40, "好", false);
渲染方法:
spriteBatch.setColor(1, 1, 1, 1);
spriteBatch.begin();
font.draw(spriteBatch, "好", 10, 100);
spriteBatch.end();
2.当我尝试这个时,屏幕上会显示3个不同的汉字,但我不知道为什么这些字符在哪里画。 asd和三个字符之间没有联系
创建方法:
FreeTypeFontGenerator gen = new FreeTypeFontGenerator(Gdx.files.internal("fonts/DFLS1B.TTF"));
font = gen.generateFont(40);
渲染方法:
spriteBatch.setColor(1, 1, 1, 1);
spriteBatch.begin();
font.draw(spriteBatch, "asd", 10, 100);
spriteBatch.end();
有没有人知道如何在libgdx中正确绘制中文字符(我使用当前版本的libgdx)? 例如: 你好吗? - 你好吗? - 你好吗?
问候
编辑: 这是一个完整的例子,它将在屏幕上显示预期的中文字符。 我从这里下载了字体: http://www.study-area.org/apt/firefly-font/
package com.mytest;
import com.badlogic.gdx.ApplicationListener;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator;
import com.badlogic.gdx.scenes.scene2d.Stage;
public class ChineseFontTest implements ApplicationListener {
private Stage stage;
private SpriteBatch spriteBatch;
public BitmapFont font;
@Override
public void create() {
stage = new Stage(800, 800);
spriteBatch = new SpriteBatch();
FreeTypeFontGenerator gen = new FreeTypeFontGenerator(Gdx.files.internal("fonts/fireflysung.ttf"));
font = gen.generateFont(40, "好你吗", false);
}
@Override
public void dispose() {
stage.dispose();
}
@Override
public void render() {
Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);
spriteBatch.setColor(1, 1, 1, 1);
spriteBatch.begin();
font.draw(spriteBatch, "你好吗", 10, 100);
spriteBatch.end();
}
@Override
public void resize(int width, int height) {
}
@Override
public void pause() {
}
@Override
public void resume() {
}
}
答案 0 :(得分:2)
转到http://www.angelcode.com/products/bmfont/并获取BMFont并使用它来查看您的字体。您还可以使用它预生成libgdx位图字体文件。问题是你的字体不是unicode字体。
当您输入Java代码时,"好"符号被转换为值U + 597D。您使用的字体ttf文件是旧式非unicode字体。这些旧的字体文件的工作方式是它们取代了像#34; a"用不同的图片。 ""是U + 61。所以在你的程序中,字母" a"被转换为U + 61,它映射到一个汉字符号但是"好"值为U + 597D不会。
您可以继续使用字体并查找每个字符的位置,以便使用正确的数字。不要使用" a"而是使用像(char)0x61这样的东西,这样就不那么容易混淆了。还是......
只需获取包含"好"的有效unicode字体。符号在U + 597D。
答案 1 :(得分:2)
这是我的答案:
package com.wang.libgdx.test.my;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.graphics.GL20;
import com.badlogic.gdx.graphics.g2d.BitmapFont;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator;
import com.badlogic.gdx.graphics.g2d.freetype.FreeTypeFontGenerator.FreeTypeFontParameter;
import com.badlogic.gdx.scenes.scene2d.Stage;
import com.badlogic.gdx.scenes.scene2d.ui.Skin;
import com.wang.libgdx.test.utils.GdxTest;
public class TtfFontTest extends GdxTest{
SpriteBatch spriteBatch;
BitmapFont font;
@Override
public void create() {
spriteBatch = new SpriteBatch();
FreeTypeFontParameter parameter = new FreeTypeFontParameter();
parameter.characters=FreeTypeFontGenerator.DEFAULT_CHARS + "你好";
parameter.size = 24;
FreeTypeFontGenerator generator = new FreeTypeFontGenerator(Gdx.files.internal("data/ui/fangzheng.ttf"));
font = generator.generateFont(parameter);
generator.dispose();
}
@Override
public void dispose() {
spriteBatch.dispose();
font.dispose();
}
@Override
public void render() {
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
spriteBatch.begin();
font.draw(spriteBatch, "helloworld", 300,300);
font.draw(spriteBatch, "你好,世界!", 300,330);
spriteBatch.end();
}
}
这是该计划的结果。 enter image description here
答案 2 :(得分:0)
libGDX中的freetype加载器实际上创建了一个BitmapFont
。要做到这一点,它需要一个字符列表。默认列表仅为字母数字。要渲染unicode,您需要使用所需的unicode字符替换/附加该列表。
以下代码应该是一些帮助(我使用AssetManager
):
FreeTypeFontLoaderParameter parameter = new FreeTypeFontLoaderParameter();
parameter.fontParameters.size = size;
parameter.fontFileName = "fonts/DFLS1B.ttf";
parameter.fontParameters.color = Color.WHITE;
parameter.fontParameters.characters = characters; // <-- here you give it the unicode list
parameter.fontParameters.magFilter = Texture.TextureFilter.Linear;
manager.load(sz, BitmapFont.class, parameter);
manager.finishLoadingAsset(sz);
注意:如果您使用资产管理器,则需要像示例中那样设置加载器:
FileHandleResolver resolver = new InternalFileHandleResolver();
manager.setLoader(FreeTypeFontGenerator.class,
new FreeTypeFontGeneratorLoader(resolver));
manager.setLoader(BitmapFont.class, ".ttf",
new FreetypeFontLoader(resolver));
我也找到了this answer。