I denne opplæringen lærer du å lage et fysikkbasert plattformspill på raskeste måte mulig med World Construction Kit.
La oss se på det endelige resultatet vi vil jobbe for:
Det er litt wonky, men det kan løses - og vent til du ser hvor raskt og enkelt det var å lage!
Last ned Box2D Alchemy Port og WCK biblioteker. Få kilden fra github og for mer informasjon, se www.sideroller.com.
Klikk på 'Prosjekt' og velg 'Nytt prosjekt' fra listen. Å velge AS3 Prosjekt Når prosjektmalen din heter navnet ditt prosjekt, peker det på en tom mappe og klikker OK.
Finn de boksene Box2D / WCK som du lastet ned i trinn 1, og plasser følgende mapper i det nye prosjektets "lib" -mappe: Box2D, Box2DAS, statister, tyngde, misc, figurer, og WCK.
Klikk på 'Project' igjen og velg Egenskaper. Klikk på fanen 'Classpaths' og legg til din lib-mappe.
Åpne Main.as i kildefilen og legg til den uthevede koden. FlashDevelop burde ha automatisk generert resten.
offentlig klasse Main utvider WCK offentlig funksjon Main (): void if (stage) init (); ellers addEventListener (Event.ADDED_TO_STAGE, init); privat funksjon init (e: Event = null): void removeEventListener (Event.ADDED_TO_STAGE, init); // inngangspunkt
Åpne Flash Professional. Trykk Ctrl + Shift + F12 for å åpne Publiseringsinnstillinger. Klikk på Flash-fanen. Velg alternativet 'Eksporter SWC'
? og klikk deretter på innstillinger knappen ved siden av ActionScript 3.0 ComboBoxen.
I kategorien Kildebane klikker du på ikonet "Bla til bane" og velg ditt lib mappe. Deretter klikker du på Bibliotekspanel-fanen og velger "Bla til SWC" -ikonet. Velg filen lib / Box2DAS / Box2D.swc.
Klikk OK i Avanserte Actionscript 3 Settings og igjen i vinduet Publiser innstillinger. Lagre FLA i mappen \ src \ i FlashDevelop-prosjektet ditt (samme mappe med Main.as).
Til slutt, trykk Ctrl + F3 for å åpne dokumentegenskapene og sett Dokumentklassen til Main.
Begynn med å bruke rektangelverktøyet til å tegne et rektangel på scenen.
Konverter rektangelet til et symbol ved å velge det og trykk på F8.
Sett registreringspunktet til sentrum. * Merk: Det er veldig viktig at du registrerer alle spillsymbolene på denne måten. Hvis du ikke gjør det, vil det påvirke hvordan objektet ditt reagerer på tyngdekraften og kollisjonene.
Klikk på "eksporter for Actionscript" og sett grunnklassen til shapes.Box
Dette kan virke mot-intuitivt, at du laget et verdensobjekt før du gjorde verden. Du kan gjøre det på en eller annen måte, men du vil se at det er raskere å gjøre det på denne måten.
Velg din statiske boksobjekt på scenen og trykk på F8.
På samme måte som du gjorde med den statiske boksen, setter du verdens registreringspunkt til sentrum og sjekker Eksporter for ActionScript.
Sett grunnklassen til wck.World
Høyreklikk på ditt nyopprettede verdenssymbol i biblioteket.
Velg "Komponentdefinisjon?"
I feltet Klasse skriver du inn wck.World
Dette er et stort salgsargument for World Construction Kit. Hvis du nå klikker på World-objektet på scenen og åpner egenskapspanelet ved å trykke Ctrl + F3, kan du redigere en haug med World-komponentens inspiserbare egenskaper under overskriften 'Komponentparametere'.
Ok, nå skal vi gjøre det samme med vårt statiske objekt.
Høyreklikk på Static Box-symbolet ditt i biblioteket.
Velg "Komponentdefinisjon?"
I feltet Klasse skriver du inn wck.BodyShape
Åpne egenskapspanelet ved å velge Statisk boksobjekt på scenen og trykk Ctrl + F3.
Rull vinduet Komponentparametre til bunnen og endre "type" fra dynamisk til statisk. Hvis du glemmer å gjøre dette, vil dine statiske komponenter (vegger, gulv, plattformer) bli utsatt for tyngdekraften og falle av skjermen ved kjøretid.
Velg ditt statiske objekt inne i verden. Kopier og lim det inn et par ganger.
Velg hver forekomst av Statisk objekt, og bruk "Free Transform", strekk, skjev og flytt dine statiske gjenstander rundt for å danne vegger og et gulv. Du trenger ikke å holde grensene på scenen.
Her er et eksempel på en av mine forsøk:
Det er klart at "å være kunstner" ikke er en forutsetning for denne opplæringen?
Hva er en god plattformspartner uten en overbevisende hovedperson?
Mens du er inne i verdensobjektet, tegne et rektangel. Føl deg fri til å bli kreativ her. Dette er det beste jeg kunne gjøre:
Konverter karakteren din til et symbol, men ikke deklarere en baseklasse ennå.
Høyreklikk på ditt nye heltesymbol i biblioteket.
Velg "Komponentdefinisjon?"
I feltet Klasse skriver du inn wck.BodyShape
Åpne FlashDevelop.
Pass på at prosjektet ditt er åpent. I \ Src \ mappe, lag en ny mappe som heter 'Vis'. I "View" opprett en ny mappe som heter "Tegn".
Høyreklikk 'Vis' og Legg til ny klasse.
Gi klassen din noe som helst HeroCharacter.as og sett grunnklassen til shapes.Box
.
Din mappestruktur skal nå se slik ut:
Dette er inngangspunktet for å legge til funksjonalitet for tegnene dine.
Legg til følgende kode i vår nye klasse:
offentlig klasse HeroCharacter utvider boks private var contacts: ContactList; offentlig overstyringsfunksjon opprette (): void reportBeginContact = true; reportEndContact = true; kontakter = ny kontaktliste (); contacts.listenTo (this); fixedRotation = true; listenWhileVisible (verden, StepEvent.STEP, world_stepEventHandler, false, 0, true); listenWhileVisible (dette, ContactEvent.BEGIN_CONTACT, this_beginContactHandler, false, 0, true); super.create ();
Ved innstilling reportBeginContact
og reportEndContact
til ekte
, vi setter eiendommer på Kroppsfasong
klasse. Vi indikerer at vi vil like Kroppsfasong
å sende ut ContactEvents
når kollisjoner begynner og når kollisjoner slutter. Vi instanserer deretter en Kontaktliste
og be det om å "høre på
dette
". ContactList.listenTo (denne)
skaper lyttere for ContactEvent.BEGIN_CONTACT
og ContactEvent.END_CONTACT
. Det skaper da håndtere for hver som lagrer kollisjonsinformasjonen. Du kan se alt dette ved å sette markøren på Kontaktliste
og trykk Ctrl + F4 i FlashDevelop.
Ved innstilling fixedRotation
til ekte
, Vi sørger for at vår helt ikke vil rotere fremover eller bakover når det kolliderer med gjenstander.
listenWhileVisible
er en annen måte å legge til hendelseslyttere. Vi kunne ha brukt addEventListener (StepEvent.STEP, parseInput, false, 0, true);
men den ekstra funksjonaliteten her er det listenWhileVisible
vil fjerne hendelseslytterne og betegne dem for søppelsamling når Entity
har blitt fjernet fra spillet. For våre formål, listenWhileVisible
er en mer optimalisert versjon av addEventListener
. * Merk: Som med addEventListener
, Bruk alltid svake referanser slik at ubrukte objekter er kvalifisert for søppelinnsamling.
Ved bruk av super.create ()
vi kaller skape()
metode på Kroppsfasong
. Dette lar oss forlenge funksjonaliteten til skape()
metode istedenfor å erstatte den.
La oss begynne med å lage vår StepEvent
handler for spillerinngang.
privat funksjon world_stepEventHandler (e: StepEvent): void
Ved hvert tidsintervall a StepEvent
vil bli sendt fra b2World
klasse i Box2D. Standardtidstrinnet er .05 sekunder. Du kan endre timestep
parameter enkelt ved å gå tilbake til Flash Professional og åpne World Component-parametrene.
Deretter bruker vi Input-verktøyet til å bestemme hvilke taster som for øyeblikket blir presset av brukeren.
privat funksjon world_stepEventHandler (e: StepEvent): void var left: Boolean = Input.kd ('LEFT'); var høyre: Boolean = Input.kd ('RIGHT'); var hopp: Boolsk = Input.kp ('UP');
Metoden Input.kd kan godta flere argumenter. Så, hvis vi ønsket å la brukeren kunne kontrollere HeroCharacter med WASD og mellomromstasten, kunne vi endre koden som følger:
privat funksjon world_stepEventHandler (e: StepEvent): void var igjen: Boolean = Input.kd ('VENSTRE', 'A'); var høyre: Boolean = Input.kd ('RIGHT', 'D'); var hopp: Boolsk = Input.kp ('UP', ',' W ');
Input.kd ()
lytter etter når en tast er nede, mens Input.kp ()
lytter for øyeblikket en tast er trykket.
Når impuls påføres på en stiv kropp, endres kroppens momentum. Momentum er produktet av masse og hastighet. Så når vi vil endre hastigheten (hastighet og retning) av spilleren vår, bruker vi en metode på b2body
kalt ApplyImpulse ()
.
privat funksjon world_stepEventHandler (e: StepEvent): void var igjen: Boolean = Input.kd ('VENSTRE', 'A'); var høyre: Boolean = Input.kd ('RIGHT', 'D'); var hopp: Boolsk = Input.kp ('UP', 'W'); hvis (hopp) b2body.ApplyImpulse (ny V2 (0, -2), b2body.GetWorldCenter ()); annet hvis ) b2body.ApplyImpulse (ny V2 (-2, 0), b2body.GetWorldCenter ()); else if (right) b2body.ApplyImpulse (ny V2 (2, 0), b2body.GetWorldCenter ());
ApplyImpulse ()
aksepterer to parametre: verdensimpulsvektoren og impulsens pekepunkt. For nå vil vi passere en ny 2D-vektor som den første parameteren for hopping, flytte til venstre og høyre (vi må justere hvordan vi håndterer å hoppe litt senere). Den andre parameteren for hver ApplyImpulse
metoden er b2body.GetWorldCenter ()
. Denne metoden returnerer verdensposisjonen til sentermassen til vår helt. Dette er viktig fordi ApplyImpulse
vil forandre helten sin vinkelhastighet hvis den ikke virker på sin midtmasse (dette er også grunnen til at vi brukte senterregistrering på helten i Flash).
Gå tilbake til Flash Professional og sett Heroesymbolets klasse til "view.characters.HeroCharacter" og la grunnklassen være tom. Sett deretter instansnavnet til din Hero-forekomst til 'helt'.
I komponentparametrene til World-komponenten fjerner du "allowDragging" og velger "scrolling." På denne måten vil brukeren ikke kunne dra din karakter rundt med musen, og kameraet følger din spiller når han beveger seg. Til slutt, i feltet 'focusOn', skriv inn 'helt', din heltens forekomstnavn.
Trykk Ctrl + Enter for å teste filmen. Du vil legge merke til at du kan flytte karakteren din ved å trykke på venstre og høyre og kan hoppe med plass. Men hvis du fortsetter å trykke på plass, vil du fortsette å hoppe opp på ubestemt tid.
Grunnen til at vi ikke kan fortsette å hoppe på ubestemt tid er at når vi er luftbårne, er det ingenting for føttene våre for å presse på for å presse oss opp. Det er ingen like kraft på føttene som skyver tilbake. Når vi er plantet fast på bakken, blir kraften som hjelper oss i å hoppe oppover og hindrer oss i å falle gjennom gulvet, kalt normal kraft. Det vi trenger å gjøre er å avgjøre hva den normale kraften er på våre spillere. Hvis det ikke er normal kraft, kan han ikke hoppe. Vi gjør det ved å benytte vår kontaktliste.
Gå tilbake til FlashDevelop. La oss endre vår hendelseshandler på en gang til:
privat funksjon world_stepEventHandler (e: StepEvent): void var manifold: b2WorldManifold = null; hvis (! contactss.isEmpty ()) manifold = getNormalForce (); var igjen: Boolean = Input.kd ('VENSTRE', 'A'); var høyre: Boolean = Input.kd ('RIGHT', 'D'); var hopp: Boolsk = Input.kp ('UP', ',' W '), hvis (hopp && manifold) var v: V2 = manifold.normal.multiplyN (-3); b2body.ApplyImpulse (v, b2body. GetWorldCenter ()); else if (left) b2body.ApplyImpulse (ny V2 (- .5, 0), b2body.GetWorldCenter ()); annet hvis (høyre) b2body.ApplyImpulse (nye V2 0), b2body.GetWorldCenter ());
Vi skriver koden for getNormalForce ()
metode på bare et sekund. Det vi vil gjøre her er å lete etter kontakter (er vår spiller berører noe?) Få en manifold som beskriver hvor spilleren berører en kontakt (på siden eller bunnen) og akselerere spilleren oppover hvis han kommer i kontakt med bakken. Hvis det ikke er noen kontakter, må vår helt være midt i luften. I så fall ville manifolden være null og spilleren ville ikke kunne hoppe.
La oss nå skrive getNormalForce ()
metode.
privat funksjon getNormalForce (): b2WorldManifold var manifold: b2WorldManifold = null; contacts.forEach (funksjon (taster: Array, contactEvent: ContactEvent) var tempManifold: b2WorldManifold = contactEvent.getWorldManifold (); hvis (tempManifold.normal.y> 0) tempManifold.normal = new V2 (0, tempManifold.normal. y); manifold = tempManifold;); contacts.clean (); retur manifold;
Før du ringer getNormalForce ()
, vi sjekker for å se om spilleren vår er i kontakt med noe. Hvis han ikke er det, vet vi at han er luftbåren. Hele grunnen til at denne funksjonen eksisterer, er å hindre at spilleren tar et annet hopp fra en vegg eller på siden av en plattform.
Først erklærer vi en lokal variabel som heter manifold
og sett den til null
. Dette er parameteren vi kommer tilbake. Hvis helten karakteren er i kontakt med noe på høyre eller venstre side (men ikke bakken), vil denne funksjonen returnere en null-manifold.
Bruke metoden contacts.forEach ()
, Vi kan sjekke hver ContactEvent i vår Kontaktliste. Alle ContactEvents har en WorldManifold eiendom. Så oppretter vi en annen lokal variabel kalt tempManifold og setter den til verdien returnert av hver contactEvent.GetWorldManifold. Deretter sjekker vi for å se om temp.normal.y er større enn null. Her spør vi, er det y-akse normal kraft?
Hvis helten er på bakken eller en plattform, nullstiller vi alle x-akse normal kraft. Unnlatelse av å gjøre dette resulterer i buggy hopping når spilleren skyves opp mot en vegg. Prøv å eksperimentere med dette. Hvis du ikke nullstiller x, får spilleren en kul (likevel upålitelig) form for Metroid-hopp-hoppe.
Til slutt, rengjør kontaktlisten. Vi ønsker ikke å håndtere de samme kontaktene mer enn en gang.
Nå som vi har en hovedperson som kan løpe rundt og hoppe, la oss legge til noen ting han kan plukke opp. Gå tilbake til Flash Professional, tegne en sirkel eller ellipse for en mynt og konverter den til et symbol. Sett klassen og baseklassen som vist:
Sett så mange forekomster av myntklassen som du vil ha på scenen. I komponentparametre setter jeg hver mynts type til statisk
slik at de er upåvirket av tyngdekraften og kan flyte på plass som i Mario, men det er opp til deg.
Akkurat nå er myntene faste, statiske gjenstander. Vi vil gjerne endre det. Gå tilbake til FlashDevelop og åpne HeroCharacter
klasse. Legg til en hendelsehandler for kollisjoner som dette:
privat funksjon this_beginContactHandler (e: ContactEvent): void
Dette er håndterer for lytteren som vi opprettet i trinn 11. Legg til følgende kode:
privat funksjon this_beginContactHandler (e: ContactEvent): void var mynt: Mynt = e.other.m_userData som Mynt; hvis (mynt) coin.remove ();
Først oppretter vi en lokal var kalt mynt
Det er samme type som Myntklassen du opprettet i Flash. ContactEvent holder styr på den andre Box2D-armaturen som er involvert i kollisjonen. Hvis det er Mynt, fjerner vi det fra scenen, og gir illusjonen om at den er samlet.
Opprett en mappe inne i \ src \ katalogen kalt 'modell'. Innvendig 'modell' lage en mappe kalt 'resultattavle' og ringe en ny klasse Scoreboard
som strekker seg EventDispatcher
. Siden vi bare vil ha en forekomst av resultattavlen rundt på en gang, skal vi følge Singleton designmønsteret. Det var en rask tips om Singleton-mønsteret på Activetuts + tidligere i år hvis du vil ha en referanse.
Skriv følgende kode i ScoreBoard-klassen:
pakke model.scoreboard import flash.errors.IllegalOperationError; importere flash.events.Event; importer flash.events.EventDispatcher; offentlig klasse ScoreKeeper utvider EventDispatcher private static var _instance: ScoreKeeper; offentlig funksjon ScoreKeeper () hvis (_instance! = null) kaste ny IllegalOperationError ("Bruk ScoreBoard.getInstance () for å få en referanse til Singleton ScoreKeeper."); ellers initialiser (); privat funksjon initialiserer (): void offentlig statisk funksjon getInstance (): ScoreKeeper if (_instance == null) _instance = ny ScoreKeeper (); returnere _instance;
Dette er Singleton-mønsteret. Vi forventer en klasse som ønsker å få tilgang til ScoreKeeper for å bruke den statiske funksjonen getInstance ()
. Hvis en forekomst allerede eksisterer, og noen (en annen utvikler på laget ditt for eksempel) forsøker å instansere ScoreKeeper gjennom sin konstruktør, vil de motta vår feilmelding og fortelle dem at ScoreKeeper kun skal nås gjennom getInstance ()
.
ScoreKeeper utvider EventDispatcher slik at den kan sende hendelser når poenget endres. Vi vil bygge et poengsum som en visningskomponent som vil abonnere på ScoreKeeper-hendelsene.
Nå trenger vi ScoreKeeper å faktisk begynne å holde poeng. Vi trenger en variabel for å holde poengsummen, en metode som øker poengsummen, en getter for poengsummen, slik at andre klasser kan få tilgang til det og en offentlig statisk const
å lagre vår hendelse type.
pakke model.scoreboard import flash.errors.IllegalOperationError; importere flash.events.Event; importer flash.events.EventDispatcher; offentlig klasse ScoreKeeper utvider EventDispatcher offentlig statisk const SCORE_CHANGED: String = "SCORE_CHANGED"; privat var _score: uint; privat statisk var _instans: ScoreKeeper; offentlig funksjon ScoreKeeper () hvis (_instance! = null) kaste ny IllegalOperationError ("Bruk ScoreBoard.getInstance () for å få en referanse til Singleton ScoreKeeper."); ellers initialiser (); privat funksjon initialisere (): void _score = 0; offentlige funksjonen økningScore (): void _score ++; dispatchEvent (ny hendelse ("SCORE_CHANGED")); offentlig statisk funksjon getInstance (): ScoreKeeper if (_instance == null) _instance = new ScoreKeeper (); returnere _instance; offentlig funksjon få score (): uint return _score;
Og det er alt vi trenger for ScoreKeeper. La oss nå lage en visningskomponent for å vise poengsummeret. Gå inn i Flash og på scenen (ikke inne i verdenssymbolet) tegne en resultattavle. Det eneste viktige her er at du bruker Tekstverktøyet til å tegne en TextField med forekomstnavnet 'poengsum
'. Konverter TextField til et filmklippssymbol som heter Scoreboard
.
Tilbake i FlashDevelop, i verdensmappen, opprett en klasse som heter 'ScoreDisplay' som utvider MovieClip. Alt vi trenger å gjøre her er å få en forekomst av ScoreKeeper og abonnere på hendelsene. Det skal se slik ut:
pakke view.world import flash.display.MovieClip; importere flash.events.Event; importer flash.text.TextField; importere model.scoreboard.ScoreKeeper; offentlig klasse ScoreDisplay utvider MovieClip private var _scoreKeeper: ScoreKeeper = ScoreKeeper.getInstance (); offentlig funksjon ScoreDisplay () this.score.text = "0"; _scoreKeeper.addEventListener (ScoreKeeper.SCORE_CHANGED, scoreBoard_ScoreChangedHandler, false, 0, true); privat funksjon scoreBoard_ScoreChangedHandler (e: Event): void this.score.text = _scoreKeeper.score.toString ();
Gå tilbake til Flash og åpne egenskapene til ScoreBoard-symbolet i biblioteket. Endre klassen til view.world.ScoreDisplay
.
Du har ett siste skritt. Gå tilbake til HeroCharacter-klassen og legg til to linjer med kode:
privat funksjon this_beginContactHandler (e: ContactEvent): void var mynt: Mynt = e.other.m_userData som Mynt; hvis (mynt) coin.remove (); scoreBoard.incrementScore ();
offentlig klasse HeroCharacter utvider boks private var contacts: ContactList; privat var scoreKeeper: ScoreKeeper = ScoreKeeper.getInstance ();
Gå inn i Flash Professsional og legg en forekomst av StaticBox
(det samme som vi pleide å lage vegger og gulvet) i verdenskommisjonen. Pass på at du setter sin type til statisk
i komponentparametrene og at plattformen er lav nok til at spilleren kan hoppe til den.
WCK gjør skape svingende plattformer veldig enkelt. Vi kan gjøre alt i Flash IDE uten å skrive noen kode.
Begynn med å tegne en sirkel. Konverter sirkelen til et symbol som heter Ledd
og sett baseklassen til wck.Joint
. Deretter høyreklikker du på Ledd
symbol i biblioteket og gå til Komponentdefinisjon. Sett klassen som wck.Joint
. I feltet Egenskaper, angi forekomstnavn som anker
og i komponentparametre, endre type
til revolute
. Dette er fugen som vil gi vår plattform en pendulhandling.
Tegn en plattform med rektangulærverktøyet. Velg den og konverter den til et symbol. Sett grunnklassen til extras.Platform
. Høyreklikk på symbolet i biblioteket og i Komponentdefinisjon, sett Klassen til extras.Platform
.
Dra ut to flere tilfeller av Joint Class i World og plasser hver i hver ende av plattformen. Oppsettet skal se slik ut:
For hver nye felleseksempel, gå inn i komponentparametre og endring type
til 'Avstand
'og i target2Name
feltet skrive 'anker
'. Test filmen din, og du bør ha en svingende plattform.
I FlashDevelop, legg til en ny klasse i \ characters \ mappen som heter EnemyCharacter
. Her er koden vi skal skrive (dette ser veldig godt ut):
pakke view.characters import Box2DAS.Common.V2; importere Box2DAS.Dynamics.ContactEvent; importere Box2DAS.Dynamics.StepEvent; importere former.Box; importere wck.ContactList; offentlig klasse EnemyCharacter utvider boks private var contacts: ContactList; privat var igjen: boolsk = sant; privat var rett: boolsk; offentlig overstyringsfunksjon opprette (): void fixedRotation = true; reportBeginContact = true; super.create (); kontakter = ny kontaktliste (); contacts.listenTo (this); listenWhileVisible (verden, StepEvent.STEP, world_stepEventHandler, false, 0, true); listenWhileVisible (dette, ContactEvent.BEGIN_CONTACT, this_beginContactHandler, false, 0, true); privat funksjon world_stepEventHandler (e: StepEvent): void if (left) b2body.ApplyImpulse (ny V2 (- .1, 0), b2body.GetWorldCenter ()); annet hvis (høyre) b2body.ApplyImpulse (ny V2 (.1, 0), b2body.GetWorldCenter ()); privat funksjon this_beginContactHandler (e: ContactEvent): void var veggen: StaticBox = e.other.m_userData som StaticBox; hvis (veggen) venstre =! venstre; høyre =! høyre;
Det eneste nye her er at hver gang objektet kolliderer med en vegg, endres retningen. Og hvert trinns begivenhet vil fiendens karakter ha en impuls brukt i den retningen han står overfor.
Gå tilbake til Flash og tegne en fiende karakter, og konverter den til et symbol med baseklassen satt til view.characters.EnemyCharacter
og klasse satt til Fiende
.
Det siste vi må gjøre er å håndtere kontakt mellom spillerens karakter og fiendens karakter. I HeroCharacter
klasse, legg til følgende kode:
privat funksjon this_beginContactHandler (e: ContactEvent): void var mynt: Mynt = e.other.m_userData som Mynt; spor (mynt); hvis (mynt) coin.remove (); scoreKeeper.incrementScore (); ellers var fiende: EnemyCharacter = e.other.m_userData som EnemyCharacter; hvis (fiende) var tempManifold: b2WorldManifold = e.getWorldManifold (); hvis (tempManifold.normal.y> 0) Util.addChildAtPosOf (verden, ny BadGuyFX (), fiende); enemy.remove ();
Hvis vår helt tar kontakt med noe og det ikke er en mynt, vil vi sjekke for å se om det er EnemyCharacter
. Hvis det er, vil vi sjekke manifolden til ContactEvent
for å finne ut om vi treffer den dårlige fyren på toppen eller på siden. Hvis vi hoppet på toppen av ham, blir han fjernet fra scenen.
Jeg ønsket å legge til en animasjon av EnemyCharacter blir squashed så i Flash jeg laget et filmklipp med en tidslinje animasjon av fienden blir knust. Jeg satte grunnklassene til det BadGuyFX
ha innvendinger misc.FX
, en klasse i WCK biblioteket som spiller gjennom sin egen tidslinje animasjon en gang og deretter setter seg til null
. Da la jeg det til scenen med util
metode addChildAtPosOf ()
. Animasjonen gjør fjerning av fienden ikke så plutselig.
Nå som du har en fungerende prototype av en plattformspakke, oppfordrer jeg deg til å fortsette å utforske hva WCK har å tilby. Jeg anbefaler spesielt å spille rundt i komponentparametrene til spillobjektene dine. Dette er en veldig morsom og rask måte å endre fysikken i spillverdenen din uten å skrive noen kode. Jeg håper du likte denne opplæringen! Takk for at du leste!