Skytespill

Planlegging og kommentarer til kode

Brukergrensesnitt med grafiske variabler:

Lurt å starte planlegging med å dokumentere variabelnavn og utseende på brukergrensesnitt:

Variabelliste:

skudd: int   Antall avfyrte skudd
poeng: int   Antall treff
     
level: int   Vanskelighetsgrad
     
fartX: int   Fart i antall pixler per tidsintervall (1/framerate)
fartY: int   Fart i antall pixler per tidsintervall (1/framerate)

Input/Hendelser og lytterfunksjoner:

MouseEvent.MOUSE_CLICK ---> skyt()
MouseEvent.MOUSE_MOVE ---> flyttSikte()
KeyBoardEvent.KEY_DOWN ---> nyFugl()
Event.ENTER_FRAME ---> tikk()

Animasjoner/Navn på nøkkelrammer:

Lurt å sette navn på nøkkelrammer slik at vi slipper å huske numrene når vi skriver kode:

sikte.gotoAndPlay("Avfyring") er bedre enn sikte.gotoAndPlay(2), særlig hvis vi endrer antall rammer i en animasjon senere!

Sikte:

KeyFrame nr:   Navn:
1   NormalSikte
2   Avfyring

Fugl:

KeyFrame nr:   Navn:
1   Vingeflapp
7   Fugl_dor

Eksempel på planlegging av kode (pseudokode):

Før man skriver kode, kan det være lurt å planlegge litt uformelt hva som skal gjøres i koden, her eksemplifisert i funksjonen skyt():

skyt():
   øk skuddteller

   animer avfyring

   sjekk om treff

   if treff:

      animer fugledød

      øk poengteller

   oppdater poengfelt på skjerm

   oppdater skuddfelt på skjerm

 

Kode:

/**************************

Skytespill

Side 261 i MMiF                          Rødt: Se kommentarer i neste avsnitt  

27.11.13

***************************/



import flash.events.MouseEvent;

import flash.events.KeyboardEvent;

import flash.events.Event;



/// --- Konstanter --- ///



const BAKKENIVA:int = 400; // y-verdi til fuglen ved start

const MINNIVA:  int = 350; // Laveste nivå for sikte



/// --- Variabler --- ///

var fartY: int = 0;	  //Fart i y-retning, bevegelse i pixler per tikk

var fartX: int = 0;	  //Fart i x-retning, bevegelse i pixler per tikk



var level: int = 10;       // Vanskelighetsgrad



var poeng: int = 0;	  // Poengteller

var skudd: int = 0;	  // Skuddteller



/// --- Hovedprogram (Klargjøring) --- ///



// Setter opp lytterfunksjoner:



stage.addEventListener(MouseEvent.MOUSE_MOVE,flyttSikte);	

stage.addEventListener(MouseEvent.CLICK,skyt);

stage.addEventListener(KeyboardEvent.KEY_DOWN,nyFugl);

//ENTER_FRAME: Følger frame-rate: Tidsintervall: t = 1/framerate

addEventListener(Event.ENTER_FRAME,tikk); 



//Skjuler vanlig pil-cursor:

Mouse.hide();





/// --- Lytter funksjoner --- ///



function flyttSikte(evt: MouseEvent) {

   sikte.x = mouseX;	// Sikte får samme posisjon som mus

   sikte.y = mouseY;

   if(sikte.y > MINNIVA) {	// Sikte aldri lavere enn MINNIVA

      sikte.y = MINNIVA;

   }//if

}//flyttSikte()



/* Avfyrer skudd, teller poeng og oppdaterer tekstfeltene */

function skyt(evt: MouseEvent) {

   skudd ++;

   sikte.gotoAndPlay("Avfyring"); 

   var treff = sikte.hitTestObject(fugl);

   if(treff) {

      fugl.gotoAndPlay("Fugl_dor");

      poeng ++ ;

   }//if

   txtPoeng.text = "Antall treff: "+poeng; 

   txtSkudd.text = "Antall skudd: "+skudd;

}//skyt()



/* Sender opp en ny fugl */

function nyFugl(evt: KeyboardEvent) {

   var tast = evt.keyCode;

   if(tast == Keyboard.SPACE) { 

      fartX = Math.random()* level * 2 - level;	// Fra -level til level

      fugl.x = Math.random() * 300 + 125;	// Fra 125 til 425

      fartY = level;

      fugl.y = BAKKENIVA;

      fugl.gotoAndPlay(1);

      if(fartX<0) {	           // Snur retning på fugl avhengig

         fugl.scaleX = -1;        	// av bevegelsesretning

      } else {

         fugl.scaleX = 1;

      }//if (retning)

   }//if (tast)

}//nyFugl()



/* Animerer fugl for hvert tidsintervall (1/framerate) */

function tikk(evt: Event) {

   fugl.x += fartX;

   fugl.y -= fartY;

}//tikk()

Kommentarer til kode:

const Variabler som ikke endres under kjøring kan med fordel deklareres som konstanter.
(Gir feilmelding hvis de blir prøvd endret, noe som kan beskytte oss mot bugs.)
flyttFugl(), flyttSikte() Mer konsekvent navnegiving enn det boken bruker gjør det lettere å
lese og forstå programkoden.
ENTER_FRAME Denne hendelsen skjer hver gang det skal skiftes ramme,
altså med tidsintervall 1/framerate. (Eks: framerate 25, gir tidsintervall 0.04 sekunder.)
Hvis man ønsker annen oppdateringshastighet, kan man lage egen Timer, eksempelvis slik:
   var timer: Timer = new Timer(50);    // Tidsintervall 50 ms

   timer.addEventListener(TimerEvent.TIMER, tikk);

   function tikk(evt: TimerEvent) {

      ...

   }//tikk()
sikte.hitTestObject(fugl) Denne metoden til MovieClip sjekker om et movieclip overlapper et annet.
if(treff) Unødvendig og klønete å skrive if (treff == true).
Dessuten mer lesbart uten unødvendig sammenligning med true.
Math.random() Denne metoden returnerer et desimaltall i intervallet [0,1> (Fra og med 0 til 0.999999..)
Skal vi kaste terning, altså ha heltallene {1,2,3,4,5,6}, kan vi gjøre:
Math.floor( Math.random() * 6) + 1
fugl.scaleX = -1 scaleX forlenger objektet i x-retning med angitt faktor. (2 fordobler lengden.)
Negativ verdi speilvender objektet i motsatt retning.