7

我想在屏幕上为我的游戏写文本,比如 fps、项目和东西的随机文本。我怎样才能写出这样的文字?

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

4

2 回答 2

5

更新:这个答案现在已经过时了,并且完全不适用于最新版本的 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

有关更多信息,您可以查看 和 的文档,TrueTypeFont以及我从中获得大部分代码java.awt.FontSlick-Util 教程。

于 2013-10-04T16:42:54.303 回答
1

尝试制作BufferedImage所需尺寸的。然后获取它的 Graphics 并绘制一个字符串。然后将其转换为 aByteBuffer并将其渲染为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()函数绘制字节缓冲区。

于 2014-10-17T17:03:28.133 回答