Por Nacho Cabanes
En nuestro juego, tenemos tres tipos de enemigos mortales: el escorpión, la araña y el murciélago. Esto ocurre en la mayoría de juegos, por lo que vamos a ver ya cómo crear varios tipos de enemigos.
Se deberá crear otras dos subclases "Murcielago" y "Aranya". La intención es que en el cuerpo del juego (en la clase "Partida", aparezcan cosas como "enemigo.Mover()", que se comporten correctamente, independientemente del tipo de enemigo que estemos mostrando en este momento.
Además (y esto ya es una particularidad de nuestro juego, no ocurre en la mayoría), cuando recoloquemos al enemigo en pantalla, deberá aparecer un enemigo al azar de estos tres.
Crear los nuevos enemigos es sencillo: imitamos la estructura que tiene el escorpión, para crear de la misma forma (pero con distintas imágenes) una araña:
public class Aranya: EnemigoMortal { public Aranya(Partida p) { miPartida = p; direccion = IZQUIERDA; CargarSecuencia( DERECHA, new string[] {"imagenes/aranyad1.png", "imagenes/aranyad1.png","imagenes/aranyad1.png", "imagenes/aranyad2.png", "imagenes/aranyad2.png","imagenes/aranyad2.png"} ); CargarSecuencia( IZQUIERDA, new string[] {"imagenes/aranyai1.png", "imagenes/aranyai1.png","imagenes/aranyai1.png", "imagenes/aranyai2.png", "imagenes/aranyai2.png","imagenes/aranyai2.png"} ); CargarSecuencia( MURIENDO, new string[] {"imagenes/aranyam1.png", "imagenes/aranyam1.png"} ); ancho = 70; alto = 50; } } /* fin de la clase Aranya */
Y también un murciélago:
public class Murcielago: EnemigoMortal { public Murcielago(Partida p) { miPartida = p; direccion = IZQUIERDA; CargarSecuencia( DERECHA, new string[] {"imagenes/murcielago.png", "imagenes/murcielago.png","imagenes/murcielago.png", "imagenes/murcielago2.png", "imagenes/murcielago2.png","imagenes/murcielago2.png"} ); CargarSecuencia( IZQUIERDA, new string[] {"imagenes/murcielago.png", "imagenes/murcielago.png","imagenes/murcielago.png", "imagenes/murcielago2.png", "imagenes/murcielago2.png","imagenes/murcielago2.png"} ); CargarSecuencia( MURIENDO, new string[] {"imagenes/murcielagom1.png", "imagenes/murcielagom1.png"} ); ancho = 70; alto = 50; } } /* fin de la clase Murcielago */
Y los cambios en el juego no son grandes: ya no declararemos a nuestro enemigo como perteneciente a la clase Escorpión, sino a EnemigoMortal, en el constructor le daremos un valor inicial (por ejemplo, que sea un Murciélago), y cada vez que recolocamos al enemigo (por ejemplo, cuando cambiamos de pantalla) escogeremos un nuevo enemigo al azar:
public class Partida { ... private EnemigoMortal enemigo; public Partida() { enemigo = new Murcielago(this); ... } // --- Recolocar enemigo (llamado al cambiar de habit. p.ej.) --- public void RecolocarEnemigo() { // Elijo un número del 0 al 2 Random numAleatorio = new Random( DateTime.Now.Millisecond ); int numeroAzar = (int) numAleatorio.Next(0,3); // Cambio el tipo de enemigo al azar if (numeroAzar == 0) enemigo = new Murcielago(this); else if (numeroAzar == 1) enemigo = new Escorpion(this); else enemigo = new Aranya(this); // Y recoloco enemigo.Recolocar(); }
Esta no es la forma más eficiente, porque va gastando memoria cada vez que el enemigo cambia, pero es la más fácil de entender, porque es repetir lo mismo que hemos hecho en el constructor. Sería más eficiente crear en el constructor un Murciélago, un Escorpión y una Araña, y limitarnos aquí a dar un valor al enemigo, sin usar "new": enemigo = murcielago;
Siguiente entrega...