有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java LibGDX sprite批处理字体错误比例渲染

我在尝试在游戏项目中使用文本/对话系统时遇到了一个问题。当我创建一个字体,并通过相机更新的spriteBatch调用其上的draw方法时,字体的每个像素都具有与一个sprite相同的尺寸

我得到以下渲染:

font draw scale issue

你能在图片上看到的是“hello”的“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) 个答案

  1. # 1 楼答案

    创建一个具有更大视口的摄像头(例如,测试设备的完美像素)。然后用它来呈现你的字体。也不要每次渲染都创建新字体,在开始时创建并使用它

    编辑:

    要计算你应该画文本的位置,应该是这样的。假设你的世界相机叫“cam”,文本相机叫“guicam”。还有一个叫做“对象”的游戏对象

    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);
    
  2. # 2 楼答案

    你可以试试Texture.TextureFilter.Linear的min&;麦克斯过滤器

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

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