Single Tech Games

Capitulo 2. An Animation Framework – parte 1

Capitulo 2
Bueno comenzamos con este libro, y en resumen al inicio nos dice que utilizaremos mayormente GamePanel, una pequeña traduccion:
GamePanel es gradualmente refinada a través del capitulo, introduciendo nociones de:

  • El bucle de animación (actualizar, renderizar, dormir)
  • Comenzando y terminando una animación
  • Doble Buffer
  • Interacción con el usuario
  • Renderización activa
  • Control de la animación basada en los FPS elegidos por el usuario
  • El manejo de imprecisiones en el temporarizador y las operaciones de dormir
  • Combinar FPS y UPS (Actualizaciones por segundo)
  • Pausando y reanudando un juego

En resumidas cuentas en este capitulo vamos a hacer bastante ^_^
1) Animation as a Threaded Canvas
Un bucle estará dentro de un hilo y consistirá en 3 etapas, actualización, renderizacion y una pequeña siesta ^^
Codigo:

public class GamePanel extends JPanel implements Runnable
{
private static final int PWIDTH = 500; // Tamaño del panel
private static final int PHEIGHT = 400;
private Thread animator; // Hilo para la animacion
private boolean running = false; // para la animacion
private boolean gameOver = false; // termina el juego
// more variables, explained later
public GamePanel()
{
    setBackground(Color.white); // fondo blanco
    setPreferredSize( new Dimension(PWIDTH, PHEIGHT));
// crea los componentes del juego
} // fin de GamePanel()
public void addNotify()
/* Espera a que Jpanel se adherido a
JFrame o JApplet antes de comenzar
*/
{
    super.addNotify(); // Crea el lugar
    startGame(); // Inicia el hilo
}
private void startGame()
// Inicializa y comienza el hilo
{
    if (animator == null || !running) {
    animator = new Thread(this);
    animator.start();
}
} // fin de startGame()
public void stopGame()
// lo usa el usuario en orden de parar la ejecución
{ running = false; }
public void run()
/* actualiza, renderiza y duerme constantemente*/
{
    running = true;
    while(running) {
        gameUpdate(); // Actualiza el estado del juego
        gameRender(); // renderiza en un buffer
        repaint(); // pinta con el buffer
    try {Thread.sleep(20); // pequeña siesta
    }
    catch(InterruptedException ex){}
    }
    System.exit(0); // cierra JFrame o JApplet si existen
} // fin de run()
private void gameUpdate()
{
if (!gameOver)
// actualiza el estado del juego ...
}
// more methods, explained later...
} // fin de la clase GamePanel

bueno no hay mucho que explicar acá, es parecido a los que hicimos con los invaders, lo único que he hecho es traducir lo del libro y no he visto la necesidad de agregar nada ya que todo es conocido
addNotify() es llamado automáticamente cuando GamePanel es adherido a un componente GUI (JFrame o JApplet) y es donde se iniciara el hilo de la animación
stopGame() utiliza un boolean para funcionar
1.1) Synchronization Concerns
La clase GamePanel tiene 2 hilos importantes, el hilo de animación (renderizado y actualización) y el hilo de eventos (teclado y mouse), si un usuario usa la tecla para terminar la aplicación, el hilo de eventos ejecutara stopGame() mientras el hilo de animación se ejecuta, entonces en cierta forma nuestra clase se queda coja, pero cuando el hilo de animación necesita usar el hilo de eventos y encuentra variables no definidas sale del bucle de animación y lo termina
1.2) Application and Game Termination
Ahora una cosa es terminar el programa y otra terminar el juego, cuando el jugador gana, por ejemplo, se termina el juego, o cuando quiere comenzar de nuevo, es por eso que debe haber un boolean completamente separado que sera manipulada por la función GameOver()
1.3) Why Sleep?
Si ven el código

public void run()
/* actualiza, renderiza y duerme constantemente*/
{
    running = true;
    while(running) {
        gameUpdate(); // Actualiza el estado del juego
        gameRender(); // renderiza en un buffer
        repaint(); // pinta con el buffer
    try {Thread.sleep(20); // pequeña siesta
    }
    catch(InterruptedException ex){}
    }
    System.exit(0); // cierra JFrame o JApplet si existen
} // fin de run()

Se darán cuenta que se duerme por 20ms, este tema fue tocado cuando estuvimos haciendo el invaders, pero igual aca una explicación mas teórica, sleep() lo que hace es congelar el hilo de animación, y deja que el cpu haga otras tareas, como es el uso del recoleccionador de basura de la maquina virtual de java, y no la “atore” a la maquina.
La segunda razón es para darle a repaint() el tiempo que necesita para procesar, primero enviara un pedido a la maquina virtual y esta procederá a devolverla, el tiempo que necesita para responder esta fuera de nuestro control
Ademas reduce las posibilidades mezclado, por ejemplo si la maquina virtual esta sobrecargada de pedidos para pintar, entonces escoger a combinar estos pedidos, lo que significa que algunos renderizados se perderían, haciendo que la animación salte como Frames se pierdan

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments