【问题标题】:Write text on the screen with LWJGL使用 LWJGL 在屏幕上书写文字
【发布时间】:2013-10-11 13:08:27
【问题描述】:

我想为我的游戏在屏幕上写文字,例如 fps、物品和东西的随机文字。我怎样才能写出这段文字?

没有基本游戏类是否可行?没有g.drawString("Hello World", 100, 100);这样的命令吗?

【问题讨论】:

  • LWJGL 确实是 OpenGL 的一个非常薄的包装器——如果你想更简单地做这样的事情,我建议使用 JMonkey 之类的东西,它提供了一个场景图形 API。
  • 你是说如果我想写文字最好转向游戏引擎?
  • 你说你正在寻找一个简单的drawString() 类型方法,这意味着你想要简单——JMonkey 会在这方面(以及许多其他方面)让事情变得更简单。

标签: java lwjgl slick2d


【解决方案1】:

更新:这个答案现在已经过时了,并且完全不适用于最新版本的 LWJGL。在我完全更新这个答案之前,我建议你看这里:https://jvm-gaming.org/t/lwjgl-stb-bindings/54537


您可以使用 Slick-util 库中的 TrueType 字体功能。

使用通用字体很容易,只需像这样创建字体:

TrueTypeFont font;
Font awtFont = new Font("Times New Roman", Font.BOLD, 24); //name, style (PLAIN, BOLD, or ITALIC), size
font = new TrueTypeFont(awtFont, false); //base Font, anti-aliasing true/false

如果你想从.ttf 文件中加载字体,那就有点棘手了:

try {
    InputStream inputStream = ResourceLoader.getResourceAsStream("myfont.ttf");
    
    Font awtFont = Font.createFont(Font.TRUETYPE_FONT, inputStream);
    awtFont = awtFont.deriveFont(24f); // set font size
    font = new TrueTypeFont(awtFont, false);
        
} catch (Exception e) {
    e.printStackTrace();
}

成功创建TrueTypeFont后,可以这样绘制:

font.drawString(100, 50, "ABC123", Color.yellow); //x, y, string to draw, color

有关更多信息,您可以查看TrueTypeFontjava.awt.Font 的文档,以及我从中获得大部分代码的Slick-Util tutorial

【讨论】:

  • 能否更新链接?它们已经过期了。提前谢谢你。
  • @IchHabsDrauf 感谢您告诉我;我会尽快解决的。
  • 我尝试了你的两个建议,但没有一个对我有用。第一个是在窗口中的指定位置只打印一个黄色 Rect。我尝试了第二个选项,将我的控制面板中的 Consolas.ttf 加载到我的项目文件夹中的目录中,并像在您的示例中一样使用 inputStream,但它不起作用。它仍然只画了一个黄色的 Reck。我该怎么办?
【解决方案2】:

尝试制作所需大小的BufferedImage。然后获取它的 Graphics 并绘制一个字符串。然后将其转换为ByteBuffer 并在OpenGL 中渲染。

String text = "ABCD";
int s = 256; //Take whatever size suits you.
BufferedImage b = new BufferedImage(s, s, BufferedImage.TYPE_4BYTE_ABGR);
Graphics2D g = b.createGraphics();
g.drawString(text, 0, 0);

int co = b.getColorModel().getNumComponents();

byte[] data = new byte[co * s * s];
b.getRaster().getDataElements(0, 0, s, s, data);

ByteBuffer pixels = BufferUtils.createByteBuffer(data.length);
pixels.put(data);
pixels.rewind();

现在pixels 包含您需要绘制的所需图像数据。 使用GL11.glTexImage2D()函数绘制字节缓冲区。

【讨论】:

  • 您能否解释一下在这种情况下我们如何使用glTexImage2D()
  • 您能否解释一下在这种情况下我们如何使用glTexImage2D()
猜你喜欢
  • 1970-01-01
  • 2014-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-22
  • 1970-01-01
  • 2017-03-30
相关资源
最近更新 更多