Ein Spiel auf LWJGL schreiben

  • Tutorial

Erstellen eines Spiels auf LWJGL # 1


Ein Spiel zu schreiben ist ein komplexer und interessanter Prozess, der viel Zeit in Anspruch nimmt. In dieser Artikelserie werde ich erklären, wie Sie ein einfaches 3D-Java-Spiel mit der LWJGL-Bibliothek erstellen.


Um Ihr Spiel zu erstellen, benötigen Sie Folgendes:


  • Fähigkeit zum Schreiben von Java-Code (Mindestanforderungen: Verständnis der Arbeit von Bedingungen, Zyklen, Zeichenfolgen, Arrays, Funktionen, Klassen)
  • Entwicklungsumgebung (Ich werde Eclipse verwenden)
  • LWJGL-Bibliothek
  • Grafikkarte, die die OpengGL-Version unterstützt, mindestens 3.3
  • Freizeit
  • Idee

Wen kümmert's, frage ich unter der Katze.

Schritt eins, Vorbereitung


Wie installiere ich das Eclipse .

Laden Sie LWJGL 2.9.3 , eine 3D-Grafikbibliothek herunter , 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


Zunächst erstellen wir die Main-Klasse im Hauptpaket und fügen den folgenden Code ein:



Wenn die Zeichenfolge mit Eingabe nicht rot markiert ist, ist alles in Ordnung (gelb hervorgehoben, da diese Bibliothek noch nicht im Code verwendet wird).

Schritt drei, Anzeige


Füllen Sie die Main-Klasse mit dem folgenden Code:

Code starten
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
publicclassMain{
	staticint width = 800, height = 600;
	static DisplayMode mainDisplayMode = new DisplayMode(width, height);
	staticboolean running = true;
	staticvoidupdate(){
		if (Display.wasResized()) {
			width = Display.getWidth();
			height = Display.getHeight();
        	}
		Display.update();	    	
    		Display.sync(60);
		if (Display.isCloseRequested()) {
        		running = false;
        	}
	}
	publicstaticvoidmain(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);
	}
}


Was passiert also hier:

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:

  1. Legt die Anzeigeposition fest (in der Mitte des Bildschirms)
  2. es ist erlaubt, seine Größe zu ändern
  3. Die vertikale Synchronisierung ist aktiviert
  4. DisplayMode wird festgelegt, in welcher Bildschirmgröße und einigen anderen Parametern gespeichert werden.
  5. In der letzten Zeile wird die Anzeige erstellt und auf dem Bildschirm angezeigt.

staticvoidupdate(){
	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:

  1. Überprüfen Sie die Fenstergröße
  2. Update anzeigen
  3. In der Zeile Display.sync (60) wird die Anzeige mit 60 Hertz synchronisiert (wenn Sie eine andere Bildschirmaktualisierungsrate haben, z. B. 59, 76, 120, 144 usw., legen Sie Ihre Frequenz fest).
  4. Schließen Sie das Fenster

Beachten Sie, wie das Programm endet, wenn der Benutzer auf das Kreuz klickt. Das Close-Flag des Fensters, Display.isCloseRequested () wird true, und die laufende Variable wird false, und die nächste Iteration führt keine (laufende) Schleife aus und wechselt zu den Anzeigezeilen .destroy (), wodurch die Anzeige zerstört wird, und System.exit (0), durch dessen Aufruf das Programm beendet wird.

Schritt vier, OpenGL


Fügen Sie den folgenden Code hinzu, um OpenGL vor der while (running) -Schleife für die Hauptfunktion zu initialisieren:

if (!GLContext.getCapabilities().OpenGL33) {
        System.err.println("Ваша видеокарта не поддерживает OpenGL 3.3.");
        System.exit(0);
}

Dieser Code prü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 umzuschalten (falls Sie mehrere haben).

Wenn also alles gut ist, unterstützt die Grafikkarte OpenGL 3.3, dann geht es weiter. 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:

  1. Schalten Sie weiche Beleuchtung in Shadern ein
  2. Aktivieren Sie Texturen
  3. Aktivieren Sie die Tiefenprüfung (so dass nahe Objekte entfernte Objekte überlappen).
  4. Stellen Sie die Reinigungsfarbe ein

In der Schleife while (running) fügen wir vor dem Aufruf der Funktion update () 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.

Zusammenfassungscode


Klicken Sie hier, um anzuzeigen
importstatic org.lwjgl.opengl.GL11.GL_COLOR_BUFFER_BIT;
importstatic org.lwjgl.opengl.GL11.GL_DEPTH_BUFFER_BIT;
importstatic org.lwjgl.opengl.GL11.GL_DEPTH_TEST;
importstatic org.lwjgl.opengl.GL11.GL_SMOOTH;
importstatic org.lwjgl.opengl.GL11.GL_TEXTURE_2D;
importstatic org.lwjgl.opengl.GL11.glClear;
importstatic org.lwjgl.opengl.GL11.glClearColor;
importstatic org.lwjgl.opengl.GL11.glEnable;
importstatic org.lwjgl.opengl.GL11.glShadeModel;
import org.lwjgl.LWJGLException;
import org.lwjgl.opengl.Display;
import org.lwjgl.opengl.DisplayMode;
import org.lwjgl.opengl.GLContext;
publicclassMain{
	staticint width = 800, height = 600;
	static DisplayMode mainDisplayMode = new DisplayMode(width, height);
	staticboolean running = true;
	staticvoidupdate(){
		if (Display.wasResized()) {
			width = Display.getWidth();
			height = Display.getHeight();
        }
		Display.update();	    	
    	Display.sync(60);
		if (Display.isCloseRequested()) {
        	running = false;
        }
	}
	publicstaticvoidmain(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% positive Antworten enthält, werde ich weiterhin eine Reihe von Artikeln schreiben.

Nur registrierte Benutzer können an der Umfrage teilnehmen. Bitte melden Sie sich an.

Schreiben Sie eine Reihe von Artikeln weiter.


Jetzt auch beliebt: