Primeros pasos programando un Juego - Java Game 1

Un juego diseñado en Java viene representado bajo las ordenes de un algoritmo de animación, cuyo objetivo es la representación de la aplicación en una ventana o en una pantalla completa.
Este algoritmo está formado por una subclase JPanel (en nuestro tutorial la llamaremos GamePanel), que actúa como un lienzo sobre el que dibujar gráficos 2D (por ejemplo, líneas, círculos, texto, imágenes). La animación es gestionada por un proceso o hilo (Thread), lo que garantiza que progrese a un ritmo constante e independiente según los caprichos del hardware y del sistema operativo, tal y como sea posible.
La tasa se mide en términos de fotogramas por segundo (FPS), donde un fotograma corresponde a un solo procesamiento de la aplicación.
JPanel se emplea como superficie del dibujo, y un bucle de animación se incrusta dentro de un hilo (Thread) local. El bucle se compone de tres etapas:
  • Update: actualización del Juego.
  • Rendering: representación de la imagen en el Panel.
  • Sleep: periodo de descanso.
Veamos un primer ejemplo en el que creamos una clase llamada GamePanel que actúa como un lienzo blanco de tamaño fijo que se incrustará dentro de un JFrame y dentro de JApplet en applets. addNotify() es llamado automáticamente por GamePanel para iniciar la animación mediante el Thread.

Ejemplo:


GamePanel tiene dos subprocesos (Thread) principales: 
  • Hilo de animación para el juego, actualizaciones y renderizado. 
  • Un hilo de procesamiento de eventos GUI (interfaz gráfica de usuario), que responde a tales cosas como pulsaciones de teclas y movimientos del ratón. Cuando el usuario pulsa una tecla para detener la aplicación ejecutará stopGame (). Establecerá el funcionamiento a falso al mismo tiempo que se ejecuta el subproceso de animación.
¿Por qué usar volatile como tipo de variable para ''running'' y ''gameOver''?
Volatile prohíbe que una variable sea copiada a la memoria local; La variable permanece en
memoria principal. Así, los cambios de esa variable por otros hilos serán vistos por el
hilo de la animación.

¿Por qué usar sleep en Thread.sleep?
El ciclo de animación incluye un tiempo arbitrario de 20 ms de reposo:

       gameUpdate (); // estado del juego se actualiza
       gameRender (); // render a un buffer
       repaint (); // pinta con el buffer
       try{
             Thread.sleep (20); // dormir un poco
             }catch (InterruptedException ex) {}
       }

Hay tres razones principales:
  • La primera es que sleep() hace que el hilo de animación deje de ejecutarse, lo que libera la CPU de otras tareas.
  • La segunda razón para la llamada sleep () es dar tiempo para que repaint() pueda ser procesada. La llamada a repaint() coloca una solicitud de repintado en la cola de eventos de JVM. Una pregunta obvia es si 20 ms es tiempo suficiente para que la solicitud se lleve a cabo. Puede parecer que puedo elegir un tiempo mas pequeño, 5 ms tal vez. Sin embargo, eso depende de la actividad del juego actua y la velocidad de la máquina en particular.
  • Finalmente, la llamada sleep() reduce la posibilidad de coalescencia de eventos: si la JVM está sobrecargada por solicitudes de repintado. Esto significa que parte de la solicitud de renderizado se omitirá, haciendo que la animación "salte".

Comentarios

Entradas populares de este blog

Timer Resolution - Contador temporal de resolución. Java Game 6

Pausa y Reanudación de un juego. Java Game 8

Renderizado y repaint(). Java Game 4