Escribir un juego en LWJGL

Creando un juego en LWJGL # 1


Escribir un juego es un proceso complejo e interesante que lleva mucho tiempo. En esta serie de artículos, le mostraré cómo crear un juego Java 3D simple usando la biblioteca LWJGL.


Para crear tu juego necesitas lo siguiente:


  • Capacidad para escribir código en Java (un mínimo necesario: comprender el funcionamiento de condiciones, bucles, cadenas, matrices, funciones, clases)
  • Entorno de desarrollo (usaré Eclipse)
  • Biblioteca LWJGL
  • Tarjeta de video compatible con la versión OpengGL no inferior a 3.3
  • Tiempo libre
  • Idea

A quién le importa, por favor, debajo del gato.

Paso uno, preparación


Cómo instalar eclipse .

Descargue LWJGL 2.9.3 , una biblioteca de gráficos en 3D, agréguelo a su proyecto.

Descargue slick-util , una biblioteca que simplifica la carga de texturas, agréguelo al proyecto.

Paso dos, verifica


Primero, cree la clase Main en el paquete principal, ingrese el siguiente código:



Si la línea con entrada no está resaltada en rojo, entonces todo está bien (resaltado en amarillo en la pantalla, porque esta biblioteca aún no se usa en el código).

Paso tres, pantalla


Rellene la clase Main con el siguiente código:

Código de inicio
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); } } 


Entonces, ¿qué está pasando aquí?

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

En estas lineas:

  1. establece la posición de visualización (en el centro de la pantalla)
  2. permitido cambiar su tamaño
  3. sincronización vertical habilitada
  4. establecer DisplayMode que almacena tamaños de pantalla y algunos otros parámetros
  5. en la última línea, la pantalla se crea y se muestra en la pantalla.

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

En la función de actualización, que se llama en un bucle infinito:

  1. Comprobar ventana de cambio de tamaño
  2. Actualización de pantalla
  3. En la línea Display.sync (60), la pantalla se sincroniza con 60 hertzios (si tiene una frecuencia diferente de actualizaciones de pantalla, por ejemplo, 59, 76, 120, 144, etc., configure su frecuencia).
  4. Comprobación de cierre de ventana

Observe cómo termina el programa cuando el usuario hace clic en la cruz, el indicador de cierre de la ventana, Display.isCloseRequested () se vuelve verdadero, y la variable en ejecución se vuelve falsa, y la próxima iteración el ciclo while (en ejecución) no se ejecutará y habrá una transición a las líneas de visualización .destroy (), que destruye la pantalla y System.exit (0), cuya llamada finaliza el programa.

Paso cuatro, OpenGL


Para inicializar OpenGL a la función principal antes del ciclo while (en ejecución), debe agregar el siguiente código:

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

Este código verifica que la tarjeta de video sea compatible con OpenGL 3.3, si la tarjeta de video no es compatible con esta versión, intente actualizar el controlador o cambiar a otra tarjeta de video (si tiene más de una).

Entonces, la verificación está hecha, si todo está bien, la tarjeta de video es compatible con OpenGL 3.3, luego seguimos adelante. Después del código de verificación, antes del bucle, agregue el siguiente código:

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

Este código configurará OpenGL de la siguiente manera:

  1. Encienda la iluminación suave en sombreadores
  2. Activar texturas
  3. Permite la verificación de profundidad (para que los objetos cercanos se superpongan a los distantes)
  4. Establecer color de limpieza

En el ciclo while (en ejecución), antes de llamar a la función update (), agregue la línea

 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

Lo cual borrará el búfer de color y el búfer de profundidad cada vez que se actualice la pantalla.

Código final


Haga clic para ver
 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); } } 


Esto concluye el primer artículo sobre cómo escribir un juego en LWJGL, si la encuesta contiene más del 50% de respuestas positivas, continuaré escribiendo una serie de artículos.

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


All Articles