字体和视口 libgdx
Font and Viewport libgdx
我目前在使用来自 libgdx 的 FreeTypeFontGenerator 时遇到了很多困难。
这是我的代码:
public class FontTestScreen extends ScreenAdapter {
private static final float WORLD_HEIGHT = 100;
private static final int FONT_SIZE = (int) (WORLD_HEIGHT/10);
private Viewport viewport;
private SpriteBatch batch;
private FreeTypeFontGenerator fontGenerator;
private BitmapFont font;
public FontTestScreen() {
fontGenerator = new FreeTypeFontGenerator(Gdx.files.internal("calibri.ttf"));
batch = new SpriteBatch();
/* Setting the viewport */
viewport = new ExtendViewport(0, WORLD_HEIGHT);
/* BitmapFont */
FreeTypeFontGenerator.FreeTypeFontParameter parameter = new FreeTypeFontGenerator.FreeTypeFontParameter();
parameter.size = FONT_SIZE;
parameter.color = Color.BLACK;
font = fontGenerator.generateFont(parameter);
}
@Override
public void resize(int width, int height) {
viewport.update(width, height, true);
batch.setProjectionMatrix(viewport.getCamera().combined);
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
font.draw(batch, "Hello", WORLD_HEIGHT/2, WORLD_HEIGHT/2);
batch.end();
}
}
我的问题如下:
如果我正确理解视口理念,我应该摆脱像素的概念。如果我的世界以米为单位,那么与其考虑像素,不如使用视口来设置我的世界坐标。在我的示例中,我的世界将有 100 米高。我想打印一个大小为 10 米的文本。问题是文本确实像素化且不可读。如果我将 world_height 更改为 1000 而不是 10,并尝试以 100 而不是 10 的大小打印我的文本,文本将不再像素化。
这种行为不会发生在纹理上!当只有比例应该很重要时,为什么我必须为此苦苦挣扎?
我找到的更合乎逻辑的答案是我做错了。所以请帮助我了解处理字体的正确方法。
您的视口以米(或其他)单位为单位。但是 FreeTypeFontGenerator 使用像素,因为它将像素绘制到位图中以创建您的字体。因此,请使用您希望字体达到的像素高度。
在您的情况下,由于您希望字体为屏幕高度的 1/10:
private static final float FONT_SCREEN_HEIGHT_FRACTION = 1/10f;
//...
parameter.size = (int)(FONT_SCREEN_HEIGHT_FRACTION * Gdx.graphics.getHeight());
然后缩放生成的字体,使其使用您的世界单位而不是像素单位:
font = fontGenerator.generateFont(parameter);
font.getData().setScale(WORLD_HEIGHT / Gdx.graphics.getHeight());
我目前在使用来自 libgdx 的 FreeTypeFontGenerator 时遇到了很多困难。
这是我的代码:
public class FontTestScreen extends ScreenAdapter {
private static final float WORLD_HEIGHT = 100;
private static final int FONT_SIZE = (int) (WORLD_HEIGHT/10);
private Viewport viewport;
private SpriteBatch batch;
private FreeTypeFontGenerator fontGenerator;
private BitmapFont font;
public FontTestScreen() {
fontGenerator = new FreeTypeFontGenerator(Gdx.files.internal("calibri.ttf"));
batch = new SpriteBatch();
/* Setting the viewport */
viewport = new ExtendViewport(0, WORLD_HEIGHT);
/* BitmapFont */
FreeTypeFontGenerator.FreeTypeFontParameter parameter = new FreeTypeFontGenerator.FreeTypeFontParameter();
parameter.size = FONT_SIZE;
parameter.color = Color.BLACK;
font = fontGenerator.generateFont(parameter);
}
@Override
public void resize(int width, int height) {
viewport.update(width, height, true);
batch.setProjectionMatrix(viewport.getCamera().combined);
}
@Override
public void render(float delta) {
Gdx.gl.glClearColor(1, 1, 1, 1);
Gdx.gl.glClear(GL20.GL_COLOR_BUFFER_BIT);
batch.begin();
font.draw(batch, "Hello", WORLD_HEIGHT/2, WORLD_HEIGHT/2);
batch.end();
}
}
我的问题如下: 如果我正确理解视口理念,我应该摆脱像素的概念。如果我的世界以米为单位,那么与其考虑像素,不如使用视口来设置我的世界坐标。在我的示例中,我的世界将有 100 米高。我想打印一个大小为 10 米的文本。问题是文本确实像素化且不可读。如果我将 world_height 更改为 1000 而不是 10,并尝试以 100 而不是 10 的大小打印我的文本,文本将不再像素化。 这种行为不会发生在纹理上!当只有比例应该很重要时,为什么我必须为此苦苦挣扎?
我找到的更合乎逻辑的答案是我做错了。所以请帮助我了解处理字体的正确方法。
您的视口以米(或其他)单位为单位。但是 FreeTypeFontGenerator 使用像素,因为它将像素绘制到位图中以创建您的字体。因此,请使用您希望字体达到的像素高度。
在您的情况下,由于您希望字体为屏幕高度的 1/10:
private static final float FONT_SCREEN_HEIGHT_FRACTION = 1/10f;
//...
parameter.size = (int)(FONT_SCREEN_HEIGHT_FRACTION * Gdx.graphics.getHeight());
然后缩放生成的字体,使其使用您的世界单位而不是像素单位:
font = fontGenerator.generateFont(parameter);
font.getData().setScale(WORLD_HEIGHT / Gdx.graphics.getHeight());