Lurt å starte planlegging med å dokumentere variabelnavn og utseende på brukergrensesnitt:
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)
MouseEvent.MOUSE_CLICK ---> skyt() MouseEvent.MOUSE_MOVE ---> flyttSikte() KeyBoardEvent.KEY_DOWN ---> nyFugl() Event.ENTER_FRAME ---> tikk()
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
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
/************************** 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()
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) + 1fugl.scaleX = -1 scaleX forlenger objektet i x-retning med angitt faktor. (2 fordobler lengden.)
Negativ verdi speilvender objektet i motsatt retning.