2013-10-04 17 views
5

Tôi muốn viết văn bản trên màn hình cho trò chơi của mình, cho những thứ như fps, văn bản ngẫu nhiên cho các mục và nội dung. Làm thế nào tôi có thể viết văn bản đó?Viết văn bản trên màn hình với LWJGL

Có thể không có lớp Trò chơi cơ bản không? Không có lệnh như thế này g.drawString("Hello World", 100, 100);?

+0

LWJGL thực sự là một trình bao bọc mỏng xung quanh OpenGL - nếu bạn muốn làm những việc như thế này đơn giản hơn, tôi muốn đề xuất một cái gì đó giống như JMonkey cung cấp API scenegraph. – berry120

+2

bạn đang nói rằng nó di chuyển tốt hơn đến một công cụ trò chơi nếu tôi muốn viết văn bản? – Israelg99

+0

Bạn nói rằng bạn đang tìm kiếm một phương thức 'drawString()' đơn giản, có nghĩa là bạn muốn đơn giản - JMonkey sẽ làm cho mọi việc đơn giản hơn về mặt này (và nhiều thứ khác). – berry120

Trả lời

4

Cập nhật: câu trả lời này hiện đã lỗi thời và hoàn toàn không hoạt động với các phiên bản LWJGL mới nhất. Cho đến khi tôi cập nhật câu trả lời này hoàn toàn, tôi khuyên bạn nên tìm kiếm ở đây: http://www.java-gaming.org/topics/lwjgl-stb-bindings/36153/view.html


Bạn có thể sử dụng các phông chữ TrueType tính năng trong thư viện Slick-util.

Sử dụng một phông chữ thông thường được dễ dàng, chỉ cần tạo phông chữ như thế này:

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 

Nếu bạn muốn tải font từ một tập tin .ttf, đó là một chút khó khăn hơn:

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(); 
} 

Sau khi bạn đã tạo thành công một TrueTypeFont, bạn có thể vẽ nó như thế này:

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

Để biết thêm thông tin, bạn có thể xem tài liệu cho TrueTypeFontjava.awt.FontSlick-Util tutorial Tôi nhận được hầu hết mã này từ.

+0

Bạn có thể cập nhật liên kết không? Họ đã hết hạn. Cảm ơn bạn trước. – IchHabsDrauf

+0

@IchHabsDrauf Cảm ơn bạn đã cho tôi biết; Tôi sẽ nhận được nó khi tôi có thể. –

+0

Tôi đã thử cả hai đề xuất của bạn và không ai trong số họ làm việc cho tôi. Người đầu tiên chỉ in một chiếc Rect màu vàng ở vị trí được chỉ định trong cửa sổ. Tôi đã thử tùy chọn thứ hai, bằng cách tải Consolas.ttf từ Control Panel của tôi vào một thư mục trong thư mục dự án của tôi và sử dụng inputStream giống như trong ví dụ của bạn nhưng nó không hoạt động. Nó vẫn chỉ vẽ một chiếc Reck màu vàng. Tôi nên làm gì? – IchHabsDrauf

1

Thử thực hiện BufferedImage kích thước được yêu cầu. Sau đó lấy Graphics của nó và vẽ một String. Sau đó, chuyển đổi nó thành một ByteBuffer và hiển thị nó trong 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(); 

Bây giờ pixels chứa dữ liệu hình ảnh cần thiết bạn cần vẽ. Sử dụng chức năng GL11.glTexImage2D() để vẽ bộ đệm byte.

+0

bạn có thể giải thích cách chúng ta có thể sử dụng 'glTexImage2D()' trong trường hợp này không? – IchHabsDrauf

+0

bạn có thể giải thích cách chúng ta có thể sử dụng 'glTexImage2D()' trong trường hợp này? – IchHabsDrauf

Các vấn đề liên quan