Drop_and_Catch 2
Lav først Drop_and_Catch 1
Denneher 2′ er, er en lidt varieret og videreudbygget version af Drop_and_Catch 1.
Kurven er drevet af piletasterne.
En og samme function bruges til at animere mindst 3 nedfaldende figurer.
Figurerne har individuelle speed- og point-værdier.
Parametre sendes videre gennem flere functions.
Setup
3 faldende objekter i form af movieclips og en kurv parkeres på scenen med instancenavnene:
heart1_mc, heart2_mc, poison_mc, net_mc (kurven).
Der oprettes også et dynamisk tekstfelt : score_txt.
Der må også gerne være flere sektioner på timelinen, med labels : “game”, “win”, mm.
Hver sit lag, osv. Også et lag til actions øverst.
Start variablerne i “game”
stop(); var ok:Boolean = true;
Her må indskydes at ‘ok’ er min midlertidige workaround for at slippe for uønskede fortsatte processer, efter man evt. har forladt denne frame som vinder eller taber. ok er true ved scriptens start, senere blir problematiske ENTER_FRAME events KUN affyret hvis ok er true, og til sidst sættes ok til false lige før “game” forlades. Det virker!
var score:Number = 0; var winScore:Number = 40; score_txt.text = score.toString(); /*---*/ var bottomStage:Number = stage.stageHeight; var topStage:Number = 0; var rightStage:Number = stage.stageWidth; /*---*/ var netSpeed:Number = 20; heart1_mc.myValue = 10; heart2_mc.myValue = 10; poison_mc.myValue = -10; /*---*/
Bemærk at nettet får sin egen netSpeed.
De tre figurer nedenunder får også deres personlige forskellige pointværdier lokalt placeret indeni sig, ved at anvende denne syntaks heart1_mc.myValue . På den måde kan variablerne myValue sagtens have samme navn, for de er lagt hos forskellige ejere.
net_mc flyttes med piletaster
Først et par booleans vi skal bruge til at chekke om tasterne er trykket ned. De er slukkede for til at begynde med:
var rightArrow:Boolean = false; var leftArrow:Boolean = false;
Et par overordnede KeyboardEvent’er skal registreres: KEY_DOWN, for når tastaturet er i brug med en hvilken som helst tast, og KEY_UP, for når en tast er sluppet.
Både KEY_DOWN og KEY_UP bliver sat til at chekke om der er tale om netop de to taster vi skal bruge, nemlig pil frem og pil tilbage.
Når en af dem er nede, blir dens tilsvarende boolean sat til true, og når en af dem er oppe, blir tilsvarende sat til false.
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyPressHANDLER); function keyPressHANDLER(e:KeyboardEvent) { if (e.keyCode == Keyboard.RIGHT) { rightArrow = true; } if (e.keyCode == Keyboard.LEFT) { leftArrow = true; } } stage.addEventListener(KeyboardEvent.KEY_UP, keyReleaseHANDLER); function keyReleaseHANDLER(e:KeyboardEvent) { if (e.keyCode == Keyboard.RIGHT) { rightArrow = false; } if (e.keyCode == Keyboard.LEFT) { leftArrow = false; } }
Således vides der præcist om piletasterne er i brug, v.h.a. rightArrow og leftArrow som er tændt eller slukket for (med true og false). rightArrow og leftArrow blir brugt om lidt til at betinge retning og bevægelse for net_mc.
Man kan godt kalde metoden lidt besværlig, men det er den bedste p.t. i AS3 for hurtig reaktion.
Nu til ENTER_FRAME igangsættelsen af net_mc, som vil registrere hvad bruger har for med de to piletaster:
net_mc.addEventListener(Event.ENTER_FRAME, netHANDLER); function netHANDLER(e:Event) { if (rightArrow) { net_mc.x += netSpeed; } if (leftArrow) { net_mc.x -= netSpeed; } }
Bemærk betingelsen: if (rightArrow) som er nøjagtigt det samme som at skrive: if (rightArrow==true). Ligesom if (!rightArrow) vil være det samme som: if (rightArrow==false).
Test filmen og se selv!
Ting falder ned
De 3 objekter blir hver især bedt om at gøre sig klar og placere sig. De får tildelt x og y værdier, random speed – og blir så sendt videre til ned-dropning.
Det gør de gennem en og samme function: POSITION(hvad hedder du?) – Den har et parameter, dvs. den vil kræve en værdi for det der står i parentheserne, ved indgangen, nemlig objektets identitet, så pågældende mc kan få den rigtige behandling.
Derfor sendes de afsted, en efter en, med navnet i parenthes:
POSITION(heart1_mc); POSITION(heart2_mc); POSITION(poison_mc);
Selve POSITION(clip) kommer her:
function POSITION(clip) { clip.y = topStage - (clip.height/2); clip.x = (Math.random()*(rightStage-clip.width))+clip.width; clip.mySpeed = (Math.random()*15) + 5;//max 20 min 5 if (clip.name == "poison_mc") { clip.mySpeed += 5; } if (ok) { clip.addEventListener(Event.ENTER_FRAME, dropHANDLER); } }
Op under toppen af scenen, en tilfældig placering på række, individuel speedværdi, lidt ekstra hvis kunden hedder poison_mc.
Hvis det er ok – dvs. hvis bruger ikke er gået, for så er ok sat til false – bliver hvert clip sat igang med dropHANDLER på hver deres ENTER_FRAME event.
function dropHANDLER(e:Event):void { var clip = e.target; clip.y += clip.mySpeed; if (clip.hitTestObject(net_mc)) { EVALUATE(clip.myValue); POSITION(clip); } else if (clip.y > bottomStage) { POSITION(clip); } }
dropHANDLER ved godt hvilket mc, som har sat den igang, og gemmer den i en variabel der kunne hedde hvadsomhelst, men nu clip igen.
Endnu 2 functions bliver kaldt under forskellige omstændigheder undervejs:
POSITION(clip) funktionen fra tidligere, med medsendt eller rettere videresendt identitetsbevis, fordi clip har ramt en bundlinie eller et net_mc og skal forberedes til en ny tur.
Den anden funktion er EVALUATE(clip.myValue); med selvangivet pointværdi, videre til regnskabsafdelingen:
function EVALUATE(receivedValue) { score += receivedValue; score_txt.text = score.toString(); if (score >= winScore) { RESUME(); gotoAndPlay("win"); } }
Points tælles op og score_txt opdateres. Der chekkes om man har vundet, men inden man går, rydder man op med : RESUME(), og her er der ikke tale om parametre:
function RESUME() { ok = false; // ha! net_mc.removeEventListener(Event.ENTER_FRAME, netHANDLER); heart1_mc.removeEventListener(Event.ENTER_FRAME, dropHANDLER); heart2_mc.removeEventListener(Event.ENTER_FRAME, dropHANDLER); poison_mc.removeEventListener(Event.ENTER_FRAME, dropHANDLER); }
Videreudbygning
Se fx. joecartoon.com/games/9
Created: 8 April 2008 • by admin
Categories: as3 • oevelse
Comments: none yet • add one!
