Tutorial 9 - Creación de un juego (I)

Paso 24 de 26

Aunque todavía nos falta por programar el botón para volver a jugar, si probamos ahora la película y llegamos al planeta, comprobaremos que después de mostrar el fotograma de que hemos ganado, al poco tiempo se mostrará el fotograma de que hemos perdido.

Esto se debe a que, pese a que no vemos la nave en los fotogramas 3 y 4, no hemos eliminado los listeners, por lo que se siguen calculando posiciones para la nave. Es decir, que después de llegar al planeta, la posición de la nave saldrá por un extremo del escenario, dando lugar a que veamos el fotograma de que hemos perdido.

Para solucionar este problema, antes del gotoAndStop que envía la cabeza lectora a los fotogramas win o lose, tenemos que eliminar los listeners que habíamos creado para la nave.

spacecraft_mc.removeEventListener(KeyboardEvent.KEY_DOWN, arrows);
spacecraft_mc.removeEventListener(Event.ENTER_FRAME, moveSpacecraft);

Después de la sentencia del gotoAndStop, que enviará la cabeza lectora a los fotogramas del final, podemos añadir el listener para habilitar el botón replay, ya que es entonces cuando el botón aparecerá en escena:

replay_btn.addEventListener(MouseEvent.CLICK, replay);

Por tanto, los pasos que ocurrirán tanto si ganamos como si perdemos, será remover en primer lugar los listeners de la nave, después ir al fotograma win o lose, según sea el caso, y por último añadir un listener al botón replay.

Salvo el nombre del fotograma al que dirigirnos, las instrucciones que damos son las mismas en ambos casos (ganar o perder). Para no repetir la programación en dos lugares diferentes (en los dos condicionales if dentro de moveSpacecraft), lo más adecuado en estos casos es crear una función independiente que contenga estas sentencias.

Para solucionar el hecho de que haya que ir a un fotograma diferente en cada caso, podemos añadir un parámetro a la función, de tal forma que reciba el nombre del fotograma al que tiene que ir.

Así podríamos incluir en la llamada a la función, a la que llamaremos gameOver, el nombre del fotograma de la siguiente manera (lo mismo pero con lose en el otro caso):

if (e.target.hitTestObject(planet_mc)) 
{
    gameOver("win"); 
}