libgdx画中文字符

时间:2014-03-19 22:33:50

标签: java android fonts libgdx chinese-locale

我喜欢在我的应用程序中打印中文文本。

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() {
}
    }

3 个答案:

答案 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