LibGDX精灵批量字体坏刻度渲染

时间:2013-12-15 14:24:40

标签: java fonts libgdx scale spritebatch

我在尝试将文本/对话框系统放入游戏项目时遇到了问题。当我创建一个字体并在其上调用draw方法传递相机更新的spriteBatch时,该字体的每个像素都具有一个精灵的相同维度。

我得到以下渲染:

font draw scale issue

你可以在图片上看到的是每个像素超大的“你好”的“h”的顶部。 相同的相机用于渲染瓷砖/精灵。

我想要实现的效果类似于:

Elliot quest example

以下是代码:

    // 15 * 12 tile size
    camera = new OrthographicCamera(Const.VIEWPORT_WIDTH, Const.VIEWPORT_HEIGHT);
    BitmapFont font = new BitmapFont(Gdx.files.internal("data/fonts/myfont.fnt"));

    // ....

    // p => player position   
    camera.position.x = p.getX();
    camera.position.y = p.getY();
    camera.update();

    batch.setProjectionMatrix(camera.combined);
    batch.begin();
    font.draw(batch, "hello", p.getX(), p.getY());
    batch.end();

我尝试使用font.setScale()但没有成功。

有人知道如何实现这个目标吗?

2 个答案:

答案 0 :(得分:6)

使用更大的视口创建摄像头(例如,完美的测试设备像素)。并用它来渲染你的字体。另外,不要在每个渲染中创建新字体,在开头创建它并使用它。

修改

要计算你应该绘制文字的位置,就像这样。让我们假设您的世界相机被称为“凸轮”,您的文本相机被称为“guicam”。 GameObject称为“对象”。

ratew = guicam.viewportWidth/cam.viewportWidth;  //<--- you should calculate these 2 only once.
rateh = guicam.viewportHeight/cam.viewportHeight;

x = guicam.position.x-(cam.position.x-object.position.x)*ratew;
y = guicam.position.y-(cam.position.y-object.position.y)*rateh;
font.draw(batch, "stuff", x, y);

答案 1 :(得分:-1)

您可以尝试使用Texture.TextureFilter.Linear进行分钟&amp;最大过滤器。

Libgdx AssetManager使用所需的过滤器加载位图字体:

BitmapFontLoader.BitmapFontParameter param = new BitmapFontLoader.BitmapFontParameter();
param.maxFilter = Texture.TextureFilter.Linear;
param.minFilter = Texture.TextureFilter.Linear;
assetManager.load(fileName, BitmapFont.class, param);