El trabajo propuesto

El personaje del juego original no se limita a desaparecer cuando muere, sino que se muestra una animación en la que cae dando vueltas. Lo mismo ocurre con el enemigo (no con todos, sólo con los enemigos mortales: el escorpión y la araña). Además, mientras el enemigo cae rodando, el juego no se para. Eso es lo que intentaremos conseguir en esta entrega (al menos para el escorpión, que es el único enemigo que tiene nuestro juego por ahora).

Forma de conseguirlo

Nuestro "Elemento Gráfico" tiene previstas varias animaciones para cuando se mueve a cada lado, pero en un caso general, podemos necesitar más animaciones: una para cuando salta, otra para cuando muere, otra para cuando aparece... La cantidad exacta depende de cada juego, pero podríamos cubrir una buena cantidad de juegos si preparamos estas direcciones:

public class ElemGrafico
{
    ...
 
    // La secuencia de imagenes, si es animada
    protected Imagen[][] secuencia;
    protected byte fotogramaActual;
    protected byte direccion;
 
    public const byte MAXDIRECCIONES = 14;
 
    public const byte ABAJO = 0;
    public const byte ARRIBA = 1;
    public const byte DERECHA = 2;
    public const byte IZQUIERDA = 3;
    public const byte ABAJOD = 4;
    public const byte ABAJOI = 5;
    public const byte ARRIBAI = 6;
    public const byte ARRIBAD = 7;
    public const byte APARECIENDO = 8;
    public const byte MURIENDO = 9;
    public const byte SALTANDOD = 10;
    public const byte SALTANDOI = 11;
    public const byte AGACHADOD = 12;
    public const byte AGACHADOI = 13;
 
    /// Constructor vacio
    public  ElemGrafico()
    {
      ...
      secuencia = new Imagen[MAXDIRECCIONES][];
    }
 

Además, deberemos distinguir el estado "visible" (el enemigo o personaje se ve en pantalla) del estado "activo" (hay que comprobar colisiones del enemigo o del personaje), porque cuando el enemigo (o más adelante nuestro personaje) muere, hay que dibujarlo en pantalla, pero ya no debemos preocuparnos de si choca con algo o no.

Nuestro "Enemigo mortal" tendrá un nuevo estado "muriendo", y cuando está en este estado, su movimiento será distinto (en este caso, simplemente caerá hasta llegar a la parte inferior de la pantalla de juego):

public class EnemigoMortal : ElemGrafico
{
    ...
    bool muriendo;     // Para la animación cuando muere
 
    public EnemigoMortal() 
    {
        ...
        muriendo = false;
    }
 
 
    public void Morir() 
    {
        muriendo = true;
        activo = false;
        CambiarDireccion(MURIENDO);
    }
 
 
    public new void Mover() 
    {
        if (muriendo) 
        {
          y += 4;
          SiguienteFotograma();
          if (y > miPartida.GetMapa().GetMaxY() )
          {
            Recolocar();
            CambiarDireccion(DERECHA);
          }
          return;
        }
 
        // Si puede seguir en la direccion actual, lo hace
        ...
 

Esta misma idea se aplicaría si muere el personaje principal: en general no podremos mostrar una animación usando un bucle "for", porque eso detendría todo el juego. En vez de eso, deberemos pasar a un nuevo estado (el "muriendo" que acabamos de ver), y necesitaríamos un método "Mover", que se llamase desde el bucle principal del juego, para que la animación prosiguiese aunque no se pulsara ninguna tecla. De la misma forma conseguiríamos (en otros juegos) que nuestro personaje pudiera saltar, y la animación del salto continuara aunque ya no estemos pulsando ninguna tecla: con un estado "saltando" y un método "Mover" genérico.

En el caso de nuestro escorpión, como el comportamiento ya está detallado en la clase más general "Enemigo Mortal", sólo falta que la subclase "Escorpión" defina la secuencia de imágenes que se debe mostrar cuando está muriendo:

public class Escorpion: EnemigoMortal
{
 
    public Escorpion(Partida p) 
    {
        miPartida = p;
        direccion = IZQUIERDA;
        CargarSecuencia( DERECHA, 
            new string[] {"imagenes/escorpiond1.png",
                    "imagenes/escorpiond1.png","imagenes/escorpiond1.png",
                    "imagenes/escorpiond2.png",
                    "imagenes/escorpiond2.png","imagenes/escorpiond2.png"} );
        CargarSecuencia( IZQUIERDA, 
          new string[] {"imagenes/escorpioni1.png",
                    "imagenes/escorpioni1.png","imagenes/escorpioni1.png",
                    "imagenes/escorpioni2.png",
                    "imagenes/escorpioni2.png","imagenes/escorpioni2.png"} );
        CargarSecuencia( MURIENDO, 
          new string[] {"imagenes/escorpionmd1.png",
                    "imagenes/escorpionmd1.png"} );
        ancho = 70;
        alto = 50;
    }
 
 
} /* fin de la clase Escorpion */
 
 

Siguiente entrega...