2013-10-04 13 views
5

Chcę napisać tekst na ekranie dla mojej gry, na przykład fps, losowy tekst na elementy i takie tam. Jak mogę napisać ten tekst?Napisz tekst na ekranie za pomocą LWJGL

Czy to możliwe bez lekcji gry podstawowej? Czy nie ma polecenia takiego jak ten g.drawString("Hello World", 100, 100);?

+0

LWJGL jest naprawdę cienkim opakowaniem wokół OpenGL - jeśli chcesz zrobić coś takiego prostszego, proponuję coś takiego jak JMonkey, który zapewnia API scenegraph. – berry120

+2

Czy mówisz, że jego lepsze przejście do silnika gry, jeśli chcę napisać tekst? – Israelg99

+0

Mówisz, że szukasz prostej metody typu 'drawString()', która oznacza, że ​​potrzebujesz prostoty - JMonkey uprości to pod tym względem (i wiele innych). – berry120

Odpowiedz

4

Aktualizacja: ta odpowiedź jest już nieaktualna i nie działa w ogóle z najnowszymi wersjami LWJGL. Dopóki nie aktualizuje tę odpowiedź w pełni, to polecam zajrzeć tutaj: http://www.java-gaming.org/topics/lwjgl-stb-bindings/36153/view.html


Można korzystać z czcionek TrueType funkcji w bibliotece Slick-util.

Używanie wspólnego czcionka jest proste, wystarczy utworzyć czcionki takiego:

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 

Jeśli chcesz załadować czcionkę z pliku .ttf, jest to trochę bardziej skomplikowane:

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

Po pomyślnym utworzeniu TrueTypeFont można go narysować w następujący sposób:

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

Aby uzyskać więcej informacji, zapoznaj się z dokumentacją dla TrueTypeFont i java.awt.Font, a także z Slick-Util tutorial Mam większość tego kodu z.

+0

Czy możesz zaktualizować linki? One już wygasły. Z góry dziękuję. – IchHabsDrauf

+0

@IchHabsDrauf Dzięki za poinformowanie mnie; Dojdę do tego, kiedy będę mógł. –

+0

Próbowałem obu twoich sugestii i żaden z nich nie pracował dla mnie. Pierwszym był wydruk tylko żółtego Recta w określonej lokalizacji w oknie. Wypróbowałem drugą opcję, ładując plik Consolas.ttf z mojego Panelu sterowania do katalogu w folderze projektu i użyłem metody inputStream, tak jak w twoim przykładzie, ale to nie zadziałało. Nadal rysował tylko żółty Reck. Co powinienem zrobić? – IchHabsDrauf

1

Spróbuj uzyskać wymagany rozmiar BufferedImage. Następnie pobierz grafikę i narysuj ciąg. Następnie zamień go na ByteBuffer i wyrenderuj w 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(); 

Teraz pixels zawiera wymagane dane obrazu, które należy narysować. Użyj funkcji GL11.glTexImage2D() do narysowania bufora bajtowego.

+0

Czy mógłbyś wyjaśnić, w jaki sposób możemy użyć "glTexImage2D()" w tym przypadku? – IchHabsDrauf

+0

czy mógłbyś wyjaśnić, w jaki sposób możemy użyć "glTexImage2D()" w tym przypadku? – IchHabsDrauf

Powiązane problemy