El trabajo propuesto

Vamos a añadir una animación cuando muere el personaje. Las pautas básicas ya las comentamos en el apartado 19...

Forma de conseguirlo

Por una parte, el personaje tendrá una nueva secuencia de movimiento, correspondiente a cuando está muriendo, y una variable de estado que permita saber si estamos en ese estado especial. Además, como el personaje "caerá", y cambiará su coordenada "y", deberemos guardar su valor anterior, para volver a dibujar el personaje en la misma posición en la que estaba:

public class Personaje : ElemGrafico
{
  short vidas;
  short yAntesAnimacion; // Para volver a la psoicion tras la animacion de muerte
  bool muriendo;
  ...
 
  public Personaje(Partida p) 
  {
    ...
    CargarSecuencia( MURIENDO, 
      new string[] {"imagenes/personajem1.png","imagenes/personajem1.png","imagenes/personajem1.png",
                    "imagenes/personajem2.png","imagenes/personajem2.png","imagenes/personajem2.png",
                    "imagenes/personajem3.png","imagenes/personajem3.png","imagenes/personajem3.png"} );
    muriendo = false;
  }
 

Además, cuando se pulsa la tecla de movimiento hacia un lado, deberemos comprobar primero si está en medio de la animación:

public void MoverDerecha() 
{
    if (muriendo) return;
 
    CambiarDireccion(DERECHA);
    ...
 

De esta forma, cuando desde "Partida" de indique que el personaje debe morir, ya no sólo perderá una vida, sino que también se memorizará su "y" inicial, se cambiará la secuencia de movimientos y se activará el estado "muriendo":

public void Morir()
{
    // Si hay colisión, pero ya está muerto, salgo
    if (muriendo) return;
 
    // Pero si acaba de entrar, empieza la animacion
    yAntesAnimacion = y;
    vidas--;
    CambiarDireccion(MURIENDO);
    muriendo = true;
}
 

Y ahora necesitaremos también un método "Mover", que se encargue de animar el personaje sin que pulsemos ninguna tecla cuando sea necesario (en nuestro caso es sólo al morir, pero en otros juegos puede ser también al aparecer, al saltar, etc.). En nuestro caso, se limitará a aumentar la "y" hasta llegar a la parte inferior de la pantalla, y en ese momento se recolocará el personaje, el enemigo, y se mostrará la cantidad de vidas restantes (y terminará la partida si no quedan vidas):

// Animación cuando muere  
public new void Mover()
{
  if (! muriendo) return;
 
  y += 4;
  SiguienteFotograma();
  if (y > miPartida.GetMapa().GetMaxY() )
  {
      CambiarDireccion(DERECHA);
      muriendo = false;
      y = yAntesAnimacion;
 
      miPartida.MostrarVidasRestantes();
 
      // Vuelvo a colocar el enemigo al azar
      miPartida.GetEnemigo().Recolocar();
 
      // Si no hay vidas, se acabó la partida
      if (vidas == 0)
          miPartida.Terminar();        
  }  
}
 

Los cambios en "Partida" son pequeños: por una parte "moverElementos" no deberá mover sólo al enemigo, sino quizás también al personaje:

// --- Animación de los enemigos y demás objetos "que se muevan solos" -----
void moverElementos()
{
    enemigo.Mover();
    personaje.Mover();
}
 

Por otra parte, como ahora es el personaje el que pide que se recoloque el enemigo y que termine la partida (dos tareas de las que antes se encargaba la propia partida), necesitaremos añadir un "GetEnemigo" para que el personaje se comunique con el enemigo y un "Terminar" para indicar que ya no quedan vidas y, por tanto, la partida ha terminado:

// --- Devuelve el enemigo actual, para que el personaje pueda
// saber cosas de el -----
public EnemigoMortal GetEnemigo() 
{
  return enemigo;
}
 
// --- Devuelve el enemigo actual, para que el personaje pueda
// saber cosas de el -----
public void Terminar() 
{
  partidaTerminada = true;
}
 

Puedes descargar todo el paquete de la versión 0.22, con todos los fuentes, el ejecutable (en la carpeta BIN/DEBUG), las imágenes, la documentación hasta la fecha y el proyecto de SharpDevelop1 y SharpDevelop3, pero SIN LAS DLL en un fichero ZIP de tamaño cercano a 800 Kb. Si no tienes las DLL de alguna versión anterior del proyecto, también puedes descargarlas en un fichero ZIP de tamaño cercano a 900 Kb.

Siguiente entrega...