1. Introducción

De poco serviría un motor de juego si sólo pudiéramos usarlo para dibujar algo en la pantalla. ¡Para escribir un juego completo, necesitamos que interactúe con el usuario! Para ser más precisos, nuestro programa debería rastrear las acciones de los usuarios y responder a ellas.

Para hacer esto, el motor del juego CodeGym tiene métodos especiales que llama cuando el usuario hace clic en los botones del mouse o en las teclas del teclado.

El punto de la clase es que tú mismo escribes estos métodos, y luego el motor del juego CodeGym es responsable de llamarlos. Todo lo que necesita es declarar estos métodos en su código. Esto es más fácil de hacer de lo que parece.


2. Trabajar con el ratón

El motor del juego tiene dos métodos para trabajar con el mouse:

void onMouseLeftClick(int x, int y)
void onMouseRightClick(int x, int y)

Simplemente declara estos métodos en su propia clase que hereda la Gameclase. Y luego escriba el código que desee en estos métodos. El motor del juego llamará a estos métodos cuando el usuario haga clic en los botones del mouse.

onMouseLeftClick(int x, int y)es llamado por el motor cuando se hace clic en el botón izquierdo del ratón . Sus parámetros son las coordenadas de la celda del campo de juego donde ocurrió el clic. Las coordenadas de la celda superior izquierda son (0,0). Para usar este método, debe anularlo, colocando la @Overrideanotación antes del nombre del método.

onMouseRightClick(int x, int y)se llama cuando se hace clic con el botón derecho del ratón . Funciona de forma similar al onMouseLeftClick(int x, int y)método.

Ejemplos de uso de estos métodos:

import com.codegym.engine.cell.Color;
import com.codegym.engine.cell.Game;
import com.codegym.engine.cell.Key;

public class MySuperGame extends Game {
   @Override
   public void initialize() {
      // Set the size of the playing field to 3x3
      setScreenSize(3, 3);

      // Paint the playing field white
      for (int x = 0; x < 3; x++) {
         for (int y = 0; y < 3; y++) {
            setCellColor(x, y, Color.WHITE);
         }
      }
   }

   @Override
   public void onMouseLeftClick(int x, int y) {
      // Put a "X" in the cell that was clicked with the left mouse button
      setCellValue(x, y, "X");
   }

   @Override
   public void onMouseRightClick(int x, int y) {
      // Clear the cell that was clicked with the right mouse button
      setCellValue(x, y, "");
   }
}

En el ejemplo anterior, declaramos ambos métodos: onMouseLeftClick()y onMouseRightClick(). El primer método se llamará cuando el usuario haga clic con el botón izquierdo del mouse en las celdas del campo de juego. El segundo método se llamará cuando se haga clic con el botón derecho del mouse.

Como argumentos, el motor del juego CodeGym pasará las (x, y)coordenadas de la celda del campo de juego donde se hizo clic con el mouse.



3. Trabajar con el teclado

El motor del juego tiene dos métodos para trabajar con el teclado:

void onKeyPress(Key key);
void onKeyReleased(Key key);

Si desea hacer algo cuando el usuario presiona una tecla, solo necesita declarar estos métodos en su clase que hereda la Gameclase.

Escribes tu código en estos métodos, y el motor del juego los llamará cuando el usuario presione (o suelte) una tecla.

onKeyPress(Key key)se llama cuando se presiona cualquier tecla . El valor de la tecla presionada (o ) se pasa al método como parámetro. Para usar este método, debe anularlo, colocando la anotación antes del nombre del método.Key.UNKNOWNkey@Override

onKeyReleased(Key key)se llama cuando se suelta cualquier tecla . El valor de la tecla correspondiente (o ) se asigna al parámetro. Para usar este método, debe anularlo, colocando la anotación antes del nombre del método.Key.UNKNOWNkey@Override

Ejemplos de uso de estos métodos:

import com.codegym.engine.cell.Color;
import com.codegym.engine.cell.Game;
import com.codegym.engine.cell.Key;

public class MySuperGame extends Game {
   @Override
   public void initialize() {
      // Set the size of the playing field to 3x3
      setScreenSize(3, 3);

      // Paint the playing field white
      for (int x = 0; x < 3; x++) {
         for (int y = 0; y < 3; y++) {
            setCellColor(x, y, Color.WHITE);
         }
      }
   }

   @Override
   public void onKeyPress(Key key) {
      // When the spacebar is pressed, the center cell turns yellow
      if (key == Key.SPACE) {
         setCellColor(1, 1, Color.YELLOW);
      }
   }

   @Override
   public void onKeyReleased(Key key) {
      // When the spacebar is released, the center cell returns to white
      if (key == Key.SPACE) {
         setCellColor(1, 1, Color.WHITE);
      }
   }
}


4. Lista de todas las claves admitidas

Cuando el motor de CodeGym llama a los métodos onKeyPress()y onKeyReleased(), les pasa información sobre la tecla presionada (soltada). Para hacer esto, el motor de CodeGym tiene un tipo especial llamado Key.

En la versión actual del motor, el Keytipo solo admite un conjunto limitado de 9 valores:

Valor Lo que el usuario presionó
Key.ENTER
El usuario presionó la tecla Enter
Key.ESCAPE
El usuario presionó la tecla Esc
Key.PAUSE
El usuario presionó la tecla Pausa
Key.SPACE
El usuario presionó la tecla Espacio
Key.LEFT
El usuario presionó la tecla de flecha izquierda
Key.RIGHT
El usuario presionó la tecla de flecha derecha
Key.UP
El usuario presionó la tecla de flecha hacia arriba
Key.DOWN
El usuario presionó la tecla de flecha hacia abajo
Key.UNKNOWN
Cualquier clave que no sean las enumeradas anteriormente

Si el jugador presiona la barra espaciadora, onKeyPress()se llamará al método con Key.SPACEel parámetro. Si el usuario presiona la flecha izquierda, entonces el parámetro será Key.LEFT. Si el usuario presiona cualquier tecla que no esté en la lista anterior, onKeyPress()se llamará al método con Key.UNKNOWNel parámetro.

El problema aquí es que los juegos CodeGym existentes fueron diseñados para ejecutarse en un teléfono. En lugar del teclado estándar, tenemos 8 botones virtuales:


5. Trabajar con un temporizador

Muchos juegos tienen lugar en tiempo real, es decir, es posible que el usuario no haga nada, pero aún ocurren ciertos eventos en el juego. Para permitirle implementar dichos juegos, agregamos un temporizador al motor del juego.

Así es como funciona: enciende el temporizador y establece el tiempo después del cual debe activarse. Por ejemplo, 500 ms. Luego, cada medio segundo, el motor del juego CodeGym llamará al onTurn()método. Un número infinito de veces, hasta que se apague el temporizador.

¿Cómo se usa un temporizador?

1. Enciende el temporizador

Para encender el temporizador, tenemos el void setTurnTimer(int timeMs)método. El método toma como argumento la duración (en milisegundos o 1/1000 de segundo) del intervalo entre devoluciones de llamada. Solo necesita llamar a este método una vez, y el motor del juego comenzará a llamar al onTurn()método cada timeMsmilisegundos.

2. Anular el onTurn(int)método

Para hacer esto, debe declarar un void onTurn(int step)método en una clase que herede la Gameclase. El motor del juego llamará a este método. Con cada llamada, el motor pasa un número secuencial que identifica la llamada al método ( 1, 2, 3, ...).

3. Apaga el temporizador

Si ya no se necesita el temporizador, por ejemplo porque el usuario ha terminado el juego, se puede apagar. Para hacer esto, simplemente llame al stopTurnTimer()método.

4 Acelerar/cambiar el temporizador

En algunos juegos, la frecuencia de los eventos aumenta regularmente, por lo que sería conveniente poder acelerar nuestro temporizador, es decir, reducir el tiempo entre llamadas. Y nada podría ser más fácil: simplemente llame setTurnTimer(int timeMs)de nuevo con el nuevo valor y el tiempo entre llamadas cambiará onTurn().

Ejemplo:

import com.codegym.engine.cell.Color;
import com.codegym.engine.cell.Game;

public class MySuperGame extends Game {
   ...
   @Override
   public void initialize() {
      // Create a 3x3 playing field
      setScreenSize(3, 3);
      showGrid(false);
      setCellValueEx(1, 1, Color.BLUE, "X", Color.ORANGE, 50);

      setTurnTimer(500); // Turn on the timer. The interval between callbacks is 500ms.
   }

   @Override
   public void onTurn(int step) {
      if (step == 100) {
         stopTurnTimer(); // If this is the 100th callback, then turn off the timer
      }

      if (step % 2 == 1) {
         // If this is an odd calllback, then set the cell background to red
         setCellColor(1, 1, Color.RED);
      } else {
         // If this is an even callback, then set the cell background to blue
         setCellColor(1, 1, Color.BLUE);
      }
   }
   ...
}

En este ejemplo simple, creamos un campo que tiene 3 celdas por 3 celdas. Luego activamos un temporizador que llamará al onTurn()método cada medio segundo.

Aquí, el color de la celda central cambiará cada medio segundo. El texto de la celda no cambiará. Después de 50 segundos (100 devoluciones de llamada), el color dejará de cambiar y el temporizador se apagará.