【问题标题】:How to draw text in world coordinate space?如何在世界坐标空间中绘制文本?
【发布时间】:2019-01-01 23:11:38
【问题描述】:

我正在 libGDX 中创建游戏。我想创建一些 UI 元素(按钮和东西),因为我的应用设计,我想在世界空间中绘制它们,就像其他游戏对象一样。

我正在使用 Freetype 生成器,它从真字体文件 (.ttf) 生成位图字体。问题是字体的尺寸是以像素为单位的。

我用来渲染世界的正交相机,视口大小约为 10x10,所以当我生成大小为 10 的字体时,它几乎覆盖了整个屏幕(太大)并且看起来很丑,因为生成的位图因为字体太小(像素太少)。

我想要的是创建精灵,以相同的大小(世界空间)绘制它并在其上绘制文本,然后基本上创建一个按钮。

是否有一些完善的方法来处理这个问题?

【问题讨论】:

  • 我也遇到过同样的问题,我发现为这样的事情使用单独的舞台要容易得多。如果您选择走那条路线,可能有一种方法可以将您的游戏阶段的坐标映射到另一个阶段。但相信我,如果没有一些 hacky 解决方案,试图在尺寸为 10x10 的舞台上绘制字体是行不通的。在我的游戏中,我将 UI 阶段和游戏阶段完全分开。但是我从来不用在世界坐标中绘制文本,所以我帮不上什么忙。
  • setUseIntegerPositions(false) 在字体上设置比 1 更小的比例。但是为使用 ScreenViewport 的文本使用单独的相机可能会更干净/更容易。您必须使用游戏的 Viewport 投影到屏幕坐标,然后取消投影到文本层的 Viewport 以确定在哪里绘制它。但要注意 LibGDX 的问题:这两种方法之一(project/unproject)会翻转 Y 坐标,而另一种则不会,因此您必须在投影到文本层之前手动翻转屏幕坐标的 Y。
  • @Tenfour04 使用单独的视口似乎可行。但是如何确定正确的尺寸呢?示例:如果整个文本所需的宽度为 100px,字符串为“HelloWorld”,如何计算使渲染文本恰好为 100px 宽的字体大小?
  • 我不知道有什么方法可以做到这一点。但是如果大约 100 px 是可以的,我会提前计算这个特定字体的平均字符宽度,以每个字体点大小的像素为单位。然后运行时的简单算术将为您提供要使用的点大小。

标签: java fonts libgdx bitmap-fonts


【解决方案1】:

感谢 cmets 的澄清,我想出了解决方案。

我选择了一个我想绘制文本的点,并通过我的世界相机将其投影到屏幕空间。然后我翻转 y 轴:

point.y = viewportHeight - point.y;

然后我用 ScreenViewport 取消投影它(用于绘制文本的单独视口,使用屏幕大小的相机,因此 1unit == 1pixel)。 现在我可以在投影中绘制文本,其中 1unit = 1pixel,在屏幕上与之前在世界空间中选择的点位于同一位置的点上。

我还希望能够在矩形边界内绘制文本。为此,我选择了另一点。此时文本应该结束。和起点做同样的程序,然后计算宽度

targetWidth = endpoint.x - startpoint.x;

然后我使用 GlypthLayout 类以某种(生成的)字体大小获取文本的实际宽度。

actualWidth = glyphLayout.width;

当我像这样缩放字体时

font.getData().setScale(targetWidth / actualWidth);

我的字体被缩放,所以绘制的文本与目标宽度一样宽。

但请注意另一个问题!当我通过 FreetypeGenerator 生成大小约为 300 时更大的 bimap 字体时,一些字母不绘制,并且丢失了。 (可能是错误)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多