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 inicioimport 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:
- establece la posición de visualización (en el centro de la pantalla)
- permitido cambiar su tamaño
- sincronización vertical habilitada
- establecer DisplayMode que almacena tamaños de pantalla y algunos otros parámetros
- 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:
- Comprobar ventana de cambio de tamaño
- Actualización de pantalla
- 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).
- 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:
- Encienda la iluminación suave en sombreadores
- Activar texturas
- Permite la verificación de profundidad (para que los objetos cercanos se superpongan a los distantes)
- 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.