¿Qué haremos esta vez?

Vamos allá...

Un enemigo animado

No es nada difícil: ya está previsto en la clase "ElemGrafico": basta con cargar una secuencia de imágenes en vez de una única imagen, y llamar a "SiguienteFotograma()" cuando queramos que se cambien de un fotograma de la animación al siguiente.

En nuestro caso, cargaremos dos secuencias: una para cuando el enemigo se mueva hacia la derecha y otra para cuando se mueva hacia la izquierda. Indicaremos en qué dirección queremos que se mueva inicialmente, y volveremos a llamar a "CambiarDireccion" cada vez que tenga que dar la vuelta.

El fuente completo quedaría así

public class Enemigo : ElemGrafico
{
 
  // Datos del enemigo
  Partida miPartida; 
 
  // Constructor
  public Enemigo(Partida p)
  {
    miPartida = p;    // Para enlazar con el resto de componentes
    MoverA(400,352);  // Resto de valores iniciales
    SetVelocidad(4,0);
    CargarSecuencia(DERECHA,
                new string[] {"imagenes/enemigoN01D01.png", 
                          "imagenes/enemigoN01D02.png", 
                          "imagenes/enemigoN01D03.png", 
                          "imagenes/enemigoN01D04.png", 
                          "imagenes/enemigoN01D05.png", 
                          "imagenes/enemigoN01D06.png", 
                          "imagenes/enemigoN01D07.png", 
                          "imagenes/enemigoN01D08.png"});
    CargarSecuencia(IZQUIERDA,
                new string[] {"imagenes/enemigoN01I01.png", 
                          "imagenes/enemigoN01I02.png", 
                          "imagenes/enemigoN01I03.png", 
                          "imagenes/enemigoN01I04.png", 
                          "imagenes/enemigoN01I05.png", 
                          "imagenes/enemigoN01I06.png", 
                          "imagenes/enemigoN01I07.png", 
                          "imagenes/enemigoN01I08.png"});
    direccion = DERECHA;
    SetAnchoAlto(36, 48);
  }
 
 
  // Métodos de movimiento
  public new void Mover() 
  {
      x += incrX;
      SiguienteFotograma();
 
      if ((x < 100) || (x > 700))
      {
          incrX = (short)(-incrX);
          if (incrX < 0)
              CambiarDireccion(IZQUIERDA);
          else
              CambiarDireccion(DERECHA);
      }
  }
 
} /* fin de la clase Enemigo */
 

Y un personaje animado

La idea es exactamente la misma: cargaremos una secuencia de imágenes en el constructor y cambiaremos de fotograma cuando corresponda, en los métodos encargados de mover (en el caso del personaje: MoverDerecha, MoverIzquierda y Mover).

Sólo dos detalles más:

  • Si vemos que el personaje (o cualquier otro elemento) se mueve demasiado rápido, se puede usar una solución sencilla: cargar cada imagen dos veces, de modo que el efecto visual será que se cambia de fotograma con menos frecuencia (realmente no ocurre eso, sino que se dibuja cada imagen durante 2 fotogramas).
  • Por una limitación (todavía) de la clase Hardware, si cargamos una secuencia, deberemos indicar después el ancho y el alto, o se quedará con los valores por defecto (32), de modo que quizá se calculen incorrectamente las colisiones.

Los cambios son:

public class Personaje : ElemGrafico
{
 
  // Constructor
  public Personaje(Partida p)
  {
    [...]
    CargarSecuencia(DERECHA,
            new string[] {"imagenes/personajeD01.png", "imagenes/personajeD01.png", 
                          "imagenes/personajeD02.png", "imagenes/personajeD02.png", 
                          "imagenes/personajeD03.png", "imagenes/personajeD03.png", 
                          "imagenes/personajeD04.png", "imagenes/personajeD04.png", 
                          "imagenes/personajeD05.png", "imagenes/personajeD05.png", 
                          "imagenes/personajeD06.png", "imagenes/personajeD06.png", 
                          "imagenes/personajeD07.png", "imagenes/personajeD07.png", 
                          "imagenes/personajeD08.png", "imagenes/personajeD08.png"});
    [...]
    direccion = DERECHA;
    SetAnchoAlto(30, 48); // Si se carga secuencia, ancho y alto deben ir detras
  }
 
 
  // Métodos de movimiento
  public void MoverDerecha() 
  {
      if (saltando || cayendo) return; // No debe moverse mientras salta
 
      CambiarDireccion(DERECHA);
      if (miPartida.GetMapa().EsPosibleMover(x + incrX, y + alto - 4,
                x + ancho + incrX, y + alto))
      {
          x += incrX;
          SiguienteFotograma();
      }
      cayendo = true;
  }
 


Y ya sabes: la versión 0.12 completa está en la página del proyecto en Google Code.

Siguiente entrega...