2013-12-15 45 views
6

我在尝试在我的游戏项目中放置文本/对话框系统时遇到了一个问题。当我创建一个字体并调用其上的绘制方法传递相机更新的spriteBatch时,字体的每个像素都具有与一个精灵相同的尺寸。LibGDX sprite批量字体坏比例渲染

我得到以下渲染:

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()没有成功尝试。

有人知道如何做到这一点吗?

回答

6

创建一个相机与一个更大的视口(例如像素完美的测试设备)。并用它来渲染你的字体。也不要为每个渲染创建一个新的字体,在开始时创建它并使用它。

编辑:

要计算你应该绘制文本的位置,它会是这样。让我们假设你的世界相机被称为“凸轮”,而你的文字相机被称为“guicam”。一个叫做“object”的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); 
+0

谢谢您的答复,但我想文字的坐标是一样的精灵渲染相机。我需要手动更新坐标吗? –

+2

是的,你必须手动计算它,我编辑我的答案,告诉你如何。 – Lestat

+0

它完美的工作,非常感谢你这个很好的答案。 –

-1

您可以尝试Texture.TextureFilter.Linear为分钟&最大的过滤器。

Libgdx AssetManager负载位图字体与所需的过滤器:

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