Fonts 字体和视口libgdx

Fonts 字体和视口libgdx,fonts,libgdx,viewport,scaling,Fonts,Libgdx,Viewport,Scaling,我目前正在努力使用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;

我目前正在努力使用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());

是的,好的。这看起来像是一个旁路,不是我们应该做的。谢谢。那是因为GUI通常是用像素完成的。这是视口原理的一个例外,因为GUI东西在像素完美时看起来更好。它使按钮的边缘和文本更清晰。但这是更多的工作,因为您必须保留资产的多个dpi版本。如果您的文本不是GUI的一部分,而是在游戏“世界”中移动,那么上述内容几乎肯定是您应该做的。