Bat_Ball
Læs det hele før du går i gang.
Du lærer mest ved at stave dig igennem koden og teste filmen ofte. Gem også ofte. Gem flere versioner, så du eksperimenterer frit med koden i en teste-fil.
Hvis du alligevel kopierer kodebidder herfra, så pas meget på anførelsestegnene – de “driller”.
Tegn og bevæg
Lav en movieclip til bat, og en movieclip til ball.
Træk dem ind på scenen i hvert sit navngivet lag og kald dem:
bat_mc
ball_mc
I et nyt AS lag skrives scriptet:
stop(); Mouse.hide(); stage.addEventListener(Event.ENTER_FRAME, stuff_mover); function stuff_mover(e:Event) :void { bat_mc.x = mouseX; }
Gem og test.
Bat følger musen. (markøren er skjult)
Selve filmens framerate kan du sætte op til 32 fp, så bevæger animationer sig mere flydende.
Bemærk Event.ENTER_FRAME, som ikke er en MouseEvent, og som sørger for konstant genudførelse af scriptet, i den framerate der er sat.
I stuff_mover funktionen (dvs. før dens afsluttende }) tilføjes:
ball_mc.x += xBallSpeed;
Men xBallSpeed skal lige defineres for at kunne bruges her.
Tilføj over stop(); dvs. i den øverste afdeling af scriptet, hvor start-variabler hører hjemme:
var xBallSpeed:Number = 10;
Test filmen. Nu bevæger bolden sig på x-linien med værdien 10px for hver frame i den rate du har sat den til.
xBallSpeed værdien lægges til ball_mc’s x-koordinat og bevæger den frem når den er positiv, og tilbage når den er negativ.
ball_mc skal standses af filmens kant og kastes tilbage på scenen.
HVIS der rammes en bestemt kant, kan xBallSpeed værdien få vendt fortegnene, og derfor fortsætte i den stik modsatte retning…
Skriv indenfor stuff_mover:
if (ball_mc.x >= stage.stageWidth) { xBallSpeed = -xBallSpeed; } if (ball_mc.x <= 0) { xBallSpeed = -xBallSpeed; }
stage.stageWidth er flash scenens egne tal for x-værdien af scenens højre kant. Venstre kant er jo bare 0.
Den kritiske iagttager vil bemærke at bolden først ‘rammer’ kanterne når den er lidt forbi. Det skyldes dens præcise x-punkt, der formodentlig ligger i dens centrum.
Hvis effekten er uønsket, må man have dens halve bredde med i beregningerne:
if (ball_mc.x >= stage.stageWidth - (ball_mc.width / 2)) { xBallSpeed = -xBallSpeed; } if (ball_mc.x <= 0 + (ball_mc.width / 2) ) { xBallSpeed = -xBallSpeed; }
Fleksibilitet
Spillet bliver mere fleksibelt af at lægge forekommende værdier og udregninger ind i variabler, og tilbagevendende handlinger i funktioner. Dels fordi koden evt. kan genbruges, eller/og fordi der kan spares flere linier kode. Værdierne kan også nemmere ændres og varieres, samt give større overblik, med de navne man selv giver funktioner og variabler.
Filmens kant-grænser ville være oplagte at lægge i variabler – det kunne jo tænkes man ville variere med en mindre bane. Fx. ‘leftLimit’ og ‘rightLimit’.
Den tilbagevendende omvendelse af xBallSpeed-værdien kunne passende være en funktion kaldt: ‘X_BOUNCE()’.
Altså 2 nye var-deklarationer henimod toppen af scriptet:
var leftLimit:Number = 0; var rightLimit:Number = stage.stageWidth;
(stage.stageWidth kan være lidt ‘buggy’, og kan erstattes med et tal, hvis du får problemer med den under upload.)
Variablerne og funktionen kan nu erstatte koden i stedet for forrige betingelser i stuff_mover og omskrive dem til:
if (ball_mc.x >= rightLimit - (ball_mc.width / 2)) { X_BOUNCE(); } if (ball_mc.x <= leftLimit + (ball_mc.width / 2)) { X_BOUNCE(); }
X_BOUNCE() er den nye function vi laver nu.
Nederst, efter stuff_mover defineres den:
function X_BOUNCE() :void { xBallSpeed *= -1; }
Plus bliver hermed vendt til minus og minus til plus! og bolden bevæger sig med den samme fartværdi, bare den modsatte vej.
Den lodrette
Prøv at lave den lodrette bevægelse selv!
(fart- og kant-Variabler øverst, bevægelse og kant-betingelser i stuff_mover, ny bounce function – eller kan man genbruge den samme?..)
Ram bolden med Battet
Igen en vigtig betingelse – øverst i betingelsesrækken i stuff_mover:
if (ball_mc.hitTestObject(bat_mc)) { Y_BOUNCE(); }
Lose scenariet
Nu er det tid til at udbygge scenen lidt – så den kommer til at se nogenlunde sådan ud – bortset fra, at ‘lose’ er stavet forkert.

Start med at lave en stop(); på første lose frame, og derefter: Mouse.show();, så vi kan se hvor vi er, når vi tester.
Vi kan godt tilføje med det samme at man skal tabe i en bestemt situation, fx. når bolden rammer bundlinien.
Så skal det skrives ind i ball-rammer-bundkant-betingelsen i stuff_mover (i stedet for Y_BOUNCE();)
gotoAndStop("lose");
I lose scenariet skal der laves lidt interface og placeres en knap, der kan sende een tilbage til spillet.
Test filmen nu!
Der opstår en fæl fejl, der bruger hele Output vinduet, og blir ved som var den en virus. Det er den igangværende ENTER_FRAME funktion, som “lever videre” og som man bør slukke efter sig før man går.
Altså: Før bruger forlader denne frame for at gå til ‘lose’ indsættes følgende:
e.target.removeEventListener(Event.ENTER_FRAME, stuff_mover);
Nederst i alle de betingelser, som udgør situationer hvor man springer videre til en anden frame og forlader stuff_mover, skal du fjerne ENTER_FRAME først, og derefter gå videre til en anden. Hvis der står mere kode tilbage i den funktion, vil flash udføre det resterende. Når det ikke er nødvendigt at udføre den, eller uhensigtsmæssigt fordi det fx. genererer en fejl – så kan du forlade funktionen med: return;. Så vil den omtalte fejl være forsvundet.
e.target.removeEventListener(Event.ENTER_FRAME, stuff_mover); gotoAndStop("lose"); /// andre afsluttende rutiner, fx. Mouse.show(); return;
Forslag til at komme videre
Lyd på. Importer mindre lyde til library, og læg forskellige lyde på game og lose (lydlaget). I property panelet indstilles de først og fremmest til ‘event’. Du kan redigere dem sporadisk gennem edit. Du kan også lægge smålyde indeni knappen på “lose”.
Du kan øge farten på ball_mc – så det bliver sværere at ramme.
Der er i forvejen betingelser og situationer du kan bruge til acceleration og hvor du kan øge speed-vardierne med et tal:
fx. Når man rammer med battet, hvergang bolden rammer kanterne, eller bare ved hver frame..
Bolden kunne også ramme skævere ved at øge værdierne forskelligt.
Bolden kunne blive mindre.. eller battet-
Bolden kan få en unge! I så fald må det nuværende niveau have den extra bold parkeret udenfor scenen og benytte en form for tæller, før den skal komme frem. (Google eller swat)
At bolden rammer en kant og at den rammer battet kunne udløse en animation for både bat og bold. En sektioneret tidslinie på fx. en bold kan jo også indeholde forskellige lyde.
Created: 1 April 2008 • by admin
Categories: as3 •oevelse
Comments: none yet • add one!
