Écrire un jeu sur LWJGL

Création d'un jeu sur LWJGL # 1


L'écriture d'un jeu est un processus complexe et intéressant qui prend beaucoup de temps. Dans cette série d'articles, je vais vous montrer comment créer un jeu Java 3D simple à l'aide de la bibliothèque LWJGL.


Pour créer votre jeu, vous avez besoin des éléments suivants:


  • Capacité à écrire du code en Java (un minimum nécessaire: comprendre le fonctionnement des conditions, des boucles, des chaînes, des tableaux, des fonctions, des classes)
  • Environnement de développement (j'utiliserai Eclipse)
  • Bibliothèque LWJGL
  • Carte vidéo prenant en charge la version OpengGL pas inférieure à 3,3
  • Temps libre
  • Idée

Peu importe, s'il vous plaît, sous le chat.

Première étape, préparation


Comment installer eclipse .

Téléchargez LWJGL 2.9.3 , une bibliothèque de graphiques 3D, ajoutez -la à votre projet.

Téléchargez slick-util , une bibliothèque qui simplifie le chargement des textures, ajoutez-la au projet.

Étape deux, vérifiez


Tout d'abord, créez la classe Main dans le package principal, mettez-y le code suivant:



Si la ligne avec entrée n'est pas surlignée en rouge, alors tout va bien (elle est surlignée en jaune sur l'écran, car cette bibliothèque n'est pas encore utilisée dans le code).

Étape trois, affichage


Remplissez la classe Main avec le code suivant:

Code de démarrage
import 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); } } 


Alors qu'est-ce qui se passe ici:

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

Dans ces lignes:

  1. définit la position d'affichage (au centre de l'écran)
  2. autorisé à le redimensionner
  3. synchronisation verticale activée
  4. définir DisplayMode qui stocke les tailles d'écran et d'autres paramètres
  5. dans la dernière ligne, l'affichage est créé et affiché à l'écran.

 static void update() { if (Display.wasResized()) { width = Display.getWidth(); height = Display.getHeight(); } Display.update(); Display.sync(60); if (Display.isCloseRequested()) { running = false; } } 

Dans la fonction de mise à jour, qui est appelée dans une boucle infinie:

  1. Vérifier la fenêtre de redimensionnement
  2. Mise à jour de l'affichage
  3. Dans la ligne Display.sync (60), l'affichage se synchronise avec 60 hertz (si vous avez une fréquence différente de mises à jour d'écran, par exemple 59, 76, 120, 144, etc., réglez votre fréquence).
  4. Fenêtre Fermer le contrôle

Remarquez comment le programme se termine lorsque l'utilisateur clique sur la croix, l'indicateur de fermeture de la fenêtre, Display.isCloseRequested () devient vrai, et la variable en cours d'exécution devient fausse, et lors de l'itération suivante, la boucle while (en cours d'exécution) ne s'exécutera pas et il y aura une transition vers les lignes d'affichage .destroy (), qui détruit l'affichage et System.exit (0), dont l'appel met fin au programme.

Quatrième étape, OpenGL


Pour initialiser OpenGL à la fonction principale avant la boucle while (en cours d'exécution), vous devez ajouter le code suivant:

 if (!GLContext.getCapabilities().OpenGL33) { System.err.println("    OpenGL 3.3."); System.exit(0); } 

Ce code vérifie que la carte vidéo prend en charge OpenGL 3.3, si la carte vidéo ne prend pas en charge cette version, essayez de mettre à jour les pilotes ou de passer à une autre carte vidéo (si vous en avez plusieurs).

Donc, la vérification est faite, si tout va bien, la carte vidéo prend en charge OpenGL 3.3, puis on passe à autre chose. Après le code de vérification, avant la boucle, ajoutez le code suivant:

 glShadeModel(GL_SMOOTH); glEnable(GL_TEXTURE_2D); glEnable(GL_DEPTH_TEST); glClearColor(1f, 0f, 0f, 1f); 

Ce code configurera OpenGL comme suit:

  1. Activez l'éclairage doux dans les shaders
  2. Activer les textures
  3. Active la vérification de la profondeur (de sorte que les objets proches chevauchent les objets distants)
  4. Définir la couleur de nettoyage

Dans la boucle while (running), avant d'appeler la fonction update (), ajoutez la ligne

 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

Ce qui effacera le tampon de couleur et le tampon de profondeur à chaque mise à jour de l'écran.

Code final


Cliquer pour voir
 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); } } 


Ceci conclut le premier article sur l'écriture d'un jeu sur LWJGL, si l'enquête contient plus de 50% de réponses positives, je continuerai à écrire une série d'articles.

Source: https://habr.com/ru/post/fr427979/


All Articles