Tutorial 9 - Creació d'un joc (I)

Pas 24 de 26

Tot i que encara que ens falta per programar el botó per tornar a jugar, si ara provem la pel·lícula i arribem al planeta, comprovarem que després de mostrar el fotograma que indica que hem guanyat, al cap de poca estona es mostrarà el fotograma que hem perdut.

Això es deu al fet que, malgrat que no veiem la nau en els fotogrames 3 i 4, no hem eliminat els listeners, per la qual cosa es continuen calculant posicions per a la nau. És a dir, que després d'arribar al planeta, la posició de la nau sortirà per un extrem de l'escenari, i això farà que vegem el fotograma que indica que hem perdut.

Per a solucionar aquest problema, abans del gotoAndStop que envia el cap lector als fotogrames win o lose, hem d’eliminar els listeners que havíem creat per a la nau.

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

Després de la sentència gotoAndStop, que enviarà el cap lector als fotogrames del final, podem afegir el listener per habilitar el botó replay, ja que és llavors quan el botó apareixerà en escena:

replay_btn.addEventListener(MouseEvent.CLICK, replay);

Per tant, els passos que es faran, tant si guanyem com si perdem, seran en primer lloc esborrar els listeners de la nau, després anar al fotograma win o lose, segons el cas, i finalment afegir un listener al botó replay.

Llevat del nom del fotograma al qual ens dirigim, les instruccions que donem són les mateixes en tots dos casos (guanyar o perdre). Per a no repetir la programació en dos llocs diferents (en els dos condicionals if dins de moveSpacecraft), el més adequat en aquests casos és crear una funció independent que contingui aquestes sentències.

Per a solucionar el fet que calgui anar en un fotograma diferent en cada cas, podem afegir un paràmetre a la funció, de tal manera que rebi el nom del fotograma on ha d’anar.

Així podríem incloure en la crida a la funció, que anomenarem gameOver, el nom del fotograma de la manera següent (el mateix però amb lose en l'altre cas):

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