字体和视口libgdx

3

我很困惑于 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的文本进行打印,则文本不再模糊。 但对纹理没有这种情况!为什么只有比例很重要时,我必须与此斗争?
我发现的更合乎逻辑的答案是我做错了。请帮助我理解处理字体的正确方式。
1个回答

3

您的视口使用的是米(或其他单位)。但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());

1
好的,没问题。虽然看起来像是一个绕过的方法,但这不是我们应该做的事情。谢谢。 - VanesBee
这是因为GUI通常使用像素完成。这是视口哲学的例外,因为GUI的外观在像素完美时更好。它可以保持按钮和文本的边缘更加清晰。但这需要更多的工作,因为您必须保留多个dpi版本的资产。如果您的文本不是GUI的一部分,而是在游戏“世界”中移动,则几乎可以肯定地采用上述方法。 - Tenfour04

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接