Bat_Ball classes
bat class
package { import flash.display.MovieClip; import flash.events.*; public class bat extends MovieClip { public function bat() { //INIT(); } function INIT() { addEventListener(Event.ENTER_FRAME, update); } function update(e:Event) { y= stage.stageHeight-(height/2); x= stage.mouseX; } function EXIT() { removeEventListener(Event.ENTER_FRAME, update); } } }
ball class
package { import flash.display.MovieClip; import flash.events.*; public class ball extends MovieClip { var xSpeed=10; var ySpeed=10; var margin=width/2; public function ball() { //INIT(); } function INIT() { y=0+margin; addEventListener(Event.ENTER_FRAME, update); } function update(e:Event) { if (x<0+margin) { x=0+margin; xBounce(); } if (x>stage.stageWidth-margin) { x=stage.stageWidth-margin; xBounce(); } if (y<0+margin) { y=0+margin; yBounce(); } if (y>=stage.stageHeight) { y=0+margin; } x+=xSpeed; y+=ySpeed; } function xBounce() { xSpeed=xSpeed*-1; gotoAndPlay("pong"); } function yBounce() { ySpeed=ySpeed*-1; gotoAndPlay("pong"); } function EXIT() { removeEventListener(Event.ENTER_FRAME, update); } } }
doc class
package { import flash.display.MovieClip; import flash.events.*; import flash.text.*; public class doc extends MovieClip { var ourBat = new bat(); var ourBall = new ball(); var score:int; var points:int=1; var scoreMIN:int=-2; var scoreMAX:int=2; public function doc() { stop(); //INIT(); back_but.addEventListener(MouseEvent.CLICK, goGame); } function INIT() { score=0; score_txt.text=score+" points yet"; addChild(ourBat); ourBat.INIT(); addChild(ourBall); ourBall.INIT(); addEventListener(Event.ENTER_FRAME, update); } function update(e:Event) { if (ourBall.hitTestObject(ourBat)) { ourBall.yBounce(); score+=points; } if (ourBall.y>stage.stageHeight) { score-=points; } result(); } function result() { //trace("Du har " + score + " points"); score_txt.text="points: "+score+" out of "+scoreMAX ; if (score==scoreMAX) { EXIT(); gotoAndStop("win"); } if (score==scoreMIN) { EXIT(); gotoAndStop("lose"); } } function EXIT() { removeEventListener(Event.ENTER_FRAME, update); removeChild(ourBat); ourBat.EXIT(); removeChild(ourBall); ourBall.EXIT(); } function goGame(e:MouseEvent) { gotoAndStop("game"); INIT(); }/**/ } }
Created: 20 April 2008 • by admin
Categories: classes • oevelse
Comments: be the first to comment
Load presentation
Tilgængelige variabler defineret øverst.
I en class, skal de stå i class definitionen, før constructer’en (hoved-functionen).
var film1:URLRequest = new URLRequest("undermappenavn/anim_playback.swf"); var film2:URLRequest = new URLRequest("undermappenavn/bat_ball_2a.swf"); var film3:URLRequest = new URLRequest("undermappenavn/fruit_extra_new_b.swf");
I en class, vil denne typisk stå i constructor’en:
var ldr:Loader = new Loader();
I nedenstående script loades og vises hver film i hver sin knap-funktion:
film1_but.addEventListener(MouseEvent.MOUSE_DOWN,film1_Handler); function film1_Handler(e:MouseEvent):void { SoundMixer.stopAll(); ldr.load(film1); box_mc.addChild(ldr); stage.frameRate=12; } film2_but.addEventListener(MouseEvent.MOUSE_DOWN,film2_Handler); function film2_Handler(e:MouseEvent):void { SoundMixer.stopAll(); ldr.load(film2); box_mc.addChild(ldr); stage.frameRate=32; } film3_but.addEventListener(MouseEvent.MOUSE_DOWN,film3_Handler); function film3_Handler(e:MouseEvent):void { SoundMixer.stopAll(); ldr.load(film3); box_mc.addChild(ldr); stage.frameRate=32; }
Nedenstående knap-funktioner tømmer loaderen, ændrer boksens egenskaber, og til sidst ‘taler’ direkte til den loadede swf’s egen tidslinie :
unload_but.addEventListener(MouseEvent.MOUSE_DOWN,unload_Handler); function unload_Handler(e:MouseEvent):void { SoundMixer.stopAll(); ldr.unload(); stage.frameRate=12; } distort_but.addEventListener(MouseEvent.MOUSE_DOWN,distort_Handler); function distort_Handler(e:MouseEvent):void { box_mc.scaleX = box_mc.scaleY = .6; box_mc.rotation=9; } normal_but.addEventListener(MouseEvent.MOUSE_DOWN,normal_Handler); function normal_Handler(e:MouseEvent):void { box_mc.scaleX = box_mc.scaleY = .6; box_mc.x = 180; box_mc.y = 64; box_mc.rotation=0; } cheat_but.addEventListener(MouseEvent.MOUSE_DOWN,cheat_Handler); function cheat_Handler(e:MouseEvent):void { MovieClip(ldr.content).gotoAndStop("win"); /* tilsvarende, kaldt fra den loadede swf's tidslinie, ville være: ////////// MovieClip(parent.parent).play(); ///////// */ }
Created: 15 April 2008 • by admin
Categories: as3 • eksempel • navigation • oevelse
Comments: be the first to comment
Timer
// timer: 3 gange 1 sekund – og så slut.
var myTimer:Timer = new Timer(1000, 3);//delay, repatCount myTimer.start(); myTimer.addEventListener(TimerEvent.TIMER, timerHandler); function timerHandler(e:TimerEvent):void { trace("Tick "+myTimer.currentCount); } myTimer.addEventListener(TimerEvent.TIMER_COMPLETE, completeHandler); function completeHandler(e:TimerEvent):void { trace("Ding completed at "+myTimer.repeatCount); }
// En knap sætter tim i gang – og ændrer dens værdier
someButton.addEventListener(MouseEvent.MOUSE_DOWN, TimerJet); function TimerJet(e:MouseEvent) { var tim = new Timer (1000, 3); tim.start(); tim.addEventListener(TimerEvent.TIMER, onTimer); function onTimer(e:TimerEvent):void { trace("Tick "+tim.currentCount); } tim.addEventListener(TimerEvent.TIMER_COMPLETE, onTimerComplete); function onTimerComplete(e:TimerEvent):void { trace("Ding completed at "+tim.repeatCount); tim.reset(); tim.delay = 500; tim.repeatCount = 5; tim.start(); } }
Created: 8 April 2008 • by admin
Categories: as3 • snippet
Comments: be the first to comment
Loader, load!
der kan loades eksterne swf, jpg, gif, png mm.
Grundkode
var loader:Loader = new Loader(); var request:URLRequest = new URLRequest ("en.swf"); loader.load(request); addChild(loader);
Supplerende funktionalitet:
load en ny fil ind og erstat den forrige loadede fil
loader.load(new URLRequest ("enAnden.swf")); addChild(loader);
load indholdet ind i en movieclip
box_mc.addChild(loader);
unload loaderen
loader.unload();
Med PROGRESS preloader og COMPLETE:
Setup: pct_txt (dynamisk tekstfelt), frames100_mc (animeret movieClip på 100 frames).
// Husk at trykke CTRL+ENTER 2 gange for at teste preloader. ldr.contentLoaderInfo.addEventListener(ProgressEvent.PROGRESS, pHANDLER); function pHANDLER(e:ProgressEvent):void { var pctLoaded:int = Math.round(e.bytesLoaded/e.bytesTotal * 100); pct_txt.text=pctLoaded.toString()+" %"; frames100_mc.gotoAndStop(pctLoaded); } ldr.contentLoaderInfo.addEventListener(Event.COMPLETE, cHANDLER); function cHANDLER(e:Event):void { e.target.content.scaleX = e.target.content.scaleY =.2; }
Created: 8 April 2008 • by admin
Categories: overblik • preloader • snippet
Comments: be the first to comment
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: be the first to comment
Drag’n drop
Setup
2 movieclips, drag_mc og target_mc, placeret på scenen et stykke fra hinanden.
Grundkode:
drag_mc.addEventListener(MouseEvent.MOUSE_DOWN, dragHANDLER); function dragHANDLER(e:MouseEvent):void { drag_mc.startDrag(); } drag_mc.addEventListener(MouseEvent.MOUSE_UP, dropHANDLER); function dropHANDLER(e:MouseEvent):void { drag_mc.stopDrag(); }
Med HitTestPoint():
var sourceX:int=drag_mc.x; var sourceY:int=drag_mc.y; drag_mc.buttonMode=true; drag_mc.addEventListener(MouseEvent.MOUSE_DOWN, dragHANDLER); function dragHANDLER(e:MouseEvent):void { drag_mc.startDrag(); ////////////////////////////////// e.target.parent.addChild(e.target);//lægger øverst /////////////////////////////////// } drag_mc.addEventListener(MouseEvent.MOUSE_UP,dropHANDLER); function dropHANDLER(e:MouseEvent):void { drag_mc.stopDrag(); if (drag_mc.hitTestPoint(target_mc.x, target_mc.y, true)) { drag_mc.x=target_mc.x; drag_mc.y=target_mc.y; } else { drag_mc.x=sourceX; drag_mc.y=sourceY; } }
Created: 7 April 2008 • by admin
Categories: as3 • snippet
Comments: 1 comment, add one
