20 noviembre 2008

Remake (parcial) de Fruity Frank... 17 - Varias vidas

Ya es el momento de tener varias vidas, que se pierdan al chocar con un enemigo. Además, cuando se acaben todas las vidas, deberemos volver a la pantalla de presentación, y poder empezar una nueva partida.

Lo de perder una vida cada vez que toquemos a un enemigo supone algunos cambios:


  • Deberemos llevar un contador de vidas.

  • Además, la cantidad de vidas restantes debería aparecer en la pantalla.

  • Cuando "nos maten", habrá que llevar a nuestro personaje y a nuestros enemigos a sus posiciones iniciales: si los dejamos donde estaban, posiblemente volverán a colisionar, y perderíamos otra vida más (o incluso varias).

  • Según sea la lógica de nuestro juego, también es frecuente que cuando choquemos con enemigo, éste también "muera" (no ocurre así en el caso concreto de Fruity Frank).

  • Deberíamos avisar al usuario de que ha perdido una vida, bien sea con una breve animación o con un cartel que se mantuviera en pantalla un par de segundos.



Además, cuando se acaben las vidas deberán ocurrir varias cosas:


  • Deberá terminar la partida actual, y volver a la pantalla de presentación.

  • Al igual que antes, deberemos avisar al usuario (en este caso, de que la partida ha terminado).

  • Deberemos comparar los puntos obtenidos con la máxima puntuación hasta el momento, y actualizarla si procede.

  • Deberemos restaurar el mapa de juego inicial, con todos sus obstáculos y sus premios.

  • Todos los enemigos deberán volver a estar activos y en sus posiciones iniciales.



De paso, la pantalla de presentación deberá permitir volver a jugar una partida, o bien abandonar el juego por completo.

Esto supone unos cuantos cambios en el fuente:


  • Ahora el cuerpo del juego debe ser repetitivo, por ejemplo así:


      Juego juego = new Juego();
// Primero inicializo (variables, imágenes, etc)
juego.inicializar();
do {
// Después, pantalla de presentacion
juego.presentacion();
// Y luego, la partida en sí
if (! juego.finDelJuego)
juego.buclePrincipal();
} while (! juego.finDelJuego);


  • Es decir, desde dentro de la "presentación" anoto si el usuario ha elegido la opción de salir de la partida ("finDelJuego") o la contraria (empezar a jugar).



  • En la presentación se puede tener que entrar al juego (jugar una partida) o tener que abandonarlo. Yo uso una variable "bool" para indicar si hay que seguir repitiendo la presentación o si hay que salir de ella, y otra variable "bool" para indicar si hay que salir de todo el juego:


      while (! salirPresentacion )
{
if (TeclaPulsada (TECLA_ESP)) {
salirPresentacion = true;
nuevaPartida();
}
if (TeclaPulsada (TECLA_S)) {
salirPresentacion = true;
finDelJuego = true;
}
...


  • (Mi función "nuevaPartida" es la que prepara las variables antes de comenzar una partida: número de vidas, posición de personaje y enemigos, etc).



  • La otra dificultad posible es para regenerar el mapa: Hay que tener el mapa guardado en un array, y copiarlo en el array "de uso" antes de empezar cada partida. No se puede hacer "mapa = mapa1;", porque entonces los dos arrays están en la misma posición de memoria, y al modificar uno, se modifica el otro automáticamente, y ya no se podría regenerar el mapa original. Tenemos que hacerlo fila por fila, con un "for":


      for (i=0; i<MAXFILAS; i++)
mapa[i] = mapa1[i];


  • El resto de cambios en el fuente deberían ser sencillos...




Para más detalles, puedes ver el estado del proyecto en: code.google.com/p/fruityfrank