Erstellen eines Spiels auf LWJGL # 1
Das Schreiben eines Spiels ist ein komplexer und interessanter Prozess, der viel Zeit in Anspruch nimmt. In dieser Artikelserie zeige ich Ihnen, wie Sie mit der LWJGL-Bibliothek ein einfaches 3D-Java-Spiel erstellen.
Um Ihr Spiel zu erstellen, benötigen Sie Folgendes:
- Fähigkeit, Code in Java zu schreiben (ein notwendiges Minimum: Verständnis der Funktionsweise von Bedingungen, Schleifen, Zeichenfolgen, Arrays, Funktionen, Klassen)
- Entwicklungsumgebung (ich werde Eclipse verwenden)
- LWJGL-Bibliothek
- Grafikkarte, die OpengGL-Version unterstützt, nicht niedriger als 3.3
- Freizeit
- Idee
Wen kümmert es bitte unter der Katze.
Erster Schritt, Vorbereitung
So installieren Sie Eclipse .
Laden Sie
LWJGL 2.9.3 herunter, eine Bibliothek mit 3D-Grafiken, und
fügen Sie sie Ihrem Projekt hinzu.
Laden Sie
slick-util herunter , eine Bibliothek, die das Laden von Texturen vereinfacht, und fügen Sie sie dem Projekt hinzu.
Schritt zwei, überprüfen
Erstellen Sie zunächst die Hauptklasse im Hauptpaket und fügen Sie den folgenden Code ein:

Wenn die Zeile mit der Eingabe nicht rot hervorgehoben ist, ist alles in Ordnung (sie wird auf dem Bildschirm gelb hervorgehoben, da diese Bibliothek im Code noch nicht verwendet wird).
Schritt drei, Anzeige
Füllen Sie die Hauptklasse mit dem folgenden Code:
Code startenimport org.lwjgl.LWJGLException; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.DisplayMode; public class Main { static int width = 800, height = 600; static DisplayMode mainDisplayMode = new DisplayMode(width, height); static boolean running = true; static void update() { if (Display.wasResized()) { width = Display.getWidth(); height = Display.getHeight(); } Display.update(); Display.sync(60); if (Display.isCloseRequested()) { running = false; } } public static void main(String[] args) { try { Display.setLocation( (Display.getDesktopDisplayMode().getWidth() - mainDisplayMode.getWidth()) / 2, Display.getDesktopDisplayMode().getHeight() - mainDisplayMode.getHeight()) / 2); Display.setResizable(true); Display.setVSyncEnabled(true); Display.setDisplayMode(mainDisplayMode); Display.create(); } catch (LWJGLException ex) { System.err.println(ex.getStackTrace().toString()); Display.destroy(); System.exit(1); } while (running) { update(); } Display.destroy(); System.exit(0); } }
Also, was ist hier los:
Display.setLocation( (Display.getDesktopDisplayMode().getWidth() - mainDisplayMode.getWidth()) / 2, (Display.getDesktopDisplayMode().getHeight() - mainDisplayMode.getHeight()) / 2); Display.setResizable(true); Display.setVSyncEnabled(true); Display.setDisplayMode(mainDisplayMode); Display.create();
In diesen Zeilen:
- Legt die Anzeigeposition fest (in der Mitte des Bildschirms)
- darf die Größe ändern
- vertikale Synchronisierung aktiviert
- Stellen Sie DisplayMode ein, in dem Bildschirmgrößen und einige andere Parameter gespeichert werden
- In der letzten Zeile wird die Anzeige erstellt und auf dem Bildschirm angezeigt.
static void update() { if (Display.wasResized()) { width = Display.getWidth(); height = Display.getHeight(); } Display.update(); Display.sync(60); if (Display.isCloseRequested()) { running = false; } }
In der Update-Funktion, die in einer Endlosschleife aufgerufen wird:
- Aktivieren Sie das Fenster Größe ändern
- Update anzeigen
- In der Zeile Display.sync (60) wird die Anzeige mit 60 Hertz synchronisiert (wenn Sie eine andere Häufigkeit von Bildschirmaktualisierungen haben, z. B. 59, 76, 120, 144 usw., stellen Sie Ihre Frequenz ein).
- Fenster schließen prüfen
Beachten Sie, wie das Programm endet, wenn der Benutzer auf das Kreuz klickt, das Fenster schließen-Flag, Display.isCloseRequested () wahr wird und die laufende Variable falsch wird und die nächste Iteration die while-Schleife nicht ausgeführt wird und ein Übergang zu den Anzeigezeilen erfolgt .destroy (), das die Anzeige zerstört, und System.exit (0), dessen Aufruf das Programm beendet.
Schritt vier, OpenGL
Um OpenGL vor der while (laufenden) Schleife für die Hauptfunktion zu initialisieren, müssen Sie den folgenden Code hinzufügen:
if (!GLContext.getCapabilities().OpenGL33) { System.err.println(" OpenGL 3.3."); System.exit(0); }
Dieser Code überprüft, ob die Grafikkarte OpenGL 3.3 unterstützt. Wenn die Grafikkarte diese Version nicht unterstützt, versuchen Sie, die Treiber zu aktualisieren oder auf eine andere Grafikkarte zu wechseln (wenn Sie mehr als eine haben).
Wenn alles in Ordnung ist, die Grafikkarte OpenGL 3.3 unterstützt, fahren wir fort. Fügen Sie nach dem Bestätigungscode vor der Schleife den folgenden Code hinzu:
glShadeModel(GL_SMOOTH); glEnable(GL_TEXTURE_2D); glEnable(GL_DEPTH_TEST); glClearColor(1f, 0f, 0f, 1f);
Dieser Code konfiguriert OpenGL wie folgt:
- Schalten Sie die sanfte Beleuchtung in Shadern ein
- Texturen einschalten
- Aktiviert die Tiefenprüfung (so dass nahe Objekte entfernte Objekte überlappen)
- Reinigungsfarbe einstellen
Fügen Sie in der while (running) -Schleife vor dem Aufrufen der update () -Funktion die Zeile hinzu
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
Dadurch werden der Farbpuffer und der Tiefenpuffer bei jeder Aktualisierung des Bildschirms gelöscht.
Endgültiger Code
Klicken Sie hier, um anzuzeigen import static org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT; import static org.lwjgl.opengl.GL11.GL_DEPTH_TEST; import static org.lwjgl.opengl.GL11.GL_SMOOTH; import static org.lwjgl.opengl.GL11.GL_TEXTURE_2D; import static org.lwjgl.opengl.GL11.glClear; import static org.lwjgl.opengl.GL11.glClearColor; import static org.lwjgl.opengl.GL11.glEnable; import static org.lwjgl.opengl.GL11.glShadeModel; import org.lwjgl.LWJGLException; import org.lwjgl.opengl.Display; import org.lwjgl.opengl.DisplayMode; import org.lwjgl.opengl.GLContext; public class Main { static int width = 800, height = 600; static DisplayMode mainDisplayMode = new DisplayMode(width, height); static boolean running = true; static void update() { if (Display.wasResized()) { width = Display.getWidth(); height = Display.getHeight(); } Display.update(); Display.sync(60); if (Display.isCloseRequested()) { running = false; } } public static void main(String[] args) { try { Display.setLocation((Display.getDesktopDisplayMode().getWidth() - mainDisplayMode.getWidth()) / 2, (Display.getDesktopDisplayMode().getHeight() - mainDisplayMode.getHeight()) / 2); Display.setResizable(true); Display.setVSyncEnabled(true); Display.setDisplayMode(mainDisplayMode); Display.create(); } catch (LWJGLException ex) { System.err.println(ex.getStackTrace().toString()); Display.destroy(); System.exit(1); } if (!GLContext.getCapabilities().OpenGL33) { System.err.println(" OpenGL 3.3."); System.exit(0); } glShadeModel(GL_SMOOTH); glEnable(GL_TEXTURE_2D); glEnable(GL_DEPTH_TEST); glClearColor(1f, 0f, 0f, 1f); while (running) { glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); update(); } Display.destroy(); System.exit(0); } }
Damit ist der erste Artikel zum Schreiben eines Spiels auf LWJGL abgeschlossen. Wenn die Umfrage mehr als 50% der positiven Antworten enthält, werde ich weiterhin eine Reihe von Artikeln schreiben.