Bygg en Physics

Build en fysikk-baserte platformer på under en time
to
Del
en
Del

Dette Cyber ​​mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av.

I denne opplæringen vil du lære å lage en fysikk-basert plattform spill på raskest mulig måte med World Construction Kit.




Endelig resultat Forhåndsvisning

La oss ta en titt på det endelige resultatet vi skal jobbe mot:

Det er litt vaklende, men som kan fikses - og vent til du ser hvordan raskt og enkelt det var å gjøre



Trinn 1: Last ned

Last ned Box2D Alchemy Port og WCK biblioteker. Få kilde fra github og for mer informasjon, se www.sideroller.com



Trinn 2:. New FlashDevelop Prosjekt

Klikk på "Prosjekt" og velg "Nytt prosjekt" fra listen. Velg AS3 Prosjekt
som prosjekt mal, navngi prosjektet, peker den til en tom katalog og klikk på OK.

Finn de Box2D /WCK biblioteker som du lastet ned i trinn 1 og plasser følgende mapper i det nye prosjektet er "lib" -mappen: Box2D
, Box2DAS
, statister
, gravitasjon
, div
, former
, og WCK
.

Klikk på "Prosjekt" igjen og velg Egenskaper. Klikk på "Classpaths-fanen og legge til lib mappen.

Åpne Main.as i kildefilen og legge den merkede koden. FlashDevelop bør ha automatisk generert resten
public class Hoved strekker WCK {offentlig funksjon main (). Void {if (scene) init (); annet addEventListener (Event.ADDED_TO_STAGE, init); } Private funksjon init (e: Hendelses = null): void {removeEventListener (Event.ADDED_TO_STAGE, init); //Inngangspunkt}}



Trinn 3: Sett opp Flash IDE

Åpne Flash Professional. Trykk Ctrl + Shift + F12 for å åpne Publish Settings. Klikk på fanen Flash. Velg alternativet "Export SWC '

.... og klikk deretter på Innstillinger
knappen ved siden av Actionscript 3.0
ComboBox.

I Kilde Sti klikker du på "bla til forløp 'ikonet og velg lib
mappe. Klikk deretter på Library Path fanen og velg "bla til SWC-ikonet. Velg filen lib /Box2DAS /Box2D.swc
.

Klikk på OK i Avansert Actionscript 3 innstillinger og igjen på Publish Settings vinduet. Lagre FLA i \\ src \\ mappe du FlashDevelop prosjektet (samme mappe med Main.as).

Til slutt, trykk Ctrl + F3 for å åpne dokumentegenskaper og angi dokument Class til hoved



Trinn 4:. Your First World Object

Start med å bruke rektangelet verktøy for å tegne et rektangel på scenen.

Konverter rektangelet til et symbol ved å velge den og trykke F8.

Sett registreringspunkt til sentrum. * Merk: Det er svært viktig at du registrerer alle spill symboler på denne måten. Unnlatelse av å gjøre dette vil påvirke hvordan objektet reagerer på gravitasjon og kollisjoner

Klikk "eksport for Action 'og sette Base Class til shapes.Box



Trinn 5:. Opprett Verden

Dette kan virke bakvendt, at du har gjort en verden objekt før du gjort din verden. Du kan gjøre det uansett, men vil du se at det er raskere å gjøre det på denne måten.

Velg Statisk blokkobjekt på scenen, og trykk på F8.

Akkurat som du gjorde med Statisk Box, satt verdens registreringspunktet til sentrum og sjekk Eksporter for Action

Sett base klassen til wck.World



Trinn 6.: definere Verden Component

Høyreklikk på den nyopprettede Verden symbol i biblioteket.

Velg "Component definisjon ..."

I Class-feltet skriver wck.World

Dette er en stor selger punkt for World Construction Kit. Hvis du nå klikker på World objekt på scenen og åpne egenskaper panelet ved å trykke Ctrl + F3, kan du redigere en haug av World komponentens inspectable eiendommer under overskriften "Component Parametere '.



Trinn 7: Definer statisk objekt Component

Ok, nå vi kommer til å gjøre det samme med vår statisk objekt

Høyre klikk på Static Box symbol i biblioteket
..

Velg "Component definisjon ..."

I Class-feltet skriver wck.BodyShape

Åpne egenskapsvinduet ved å velge Static blokkobjekt på scenen og trykke Ctrl + F3 .

Rull Component Parametere vinduet til bunnen og endre «type» fra dynamisk til statisk. Hvis du glemmer å gjøre dette, vil statiske komponenter (vegger, gulv, plattformer) blitt utsatt for tyngdekraften og faller utenfor skjermen under kjøring



Trinn 8:. Bygg gulv og vegger

Velg statisk objekt inne of the World. Kopier og lim det et par ganger.

Velg hver forekomst av statisk objekt og ved å bruke "Free Transform", stretch, forskyve seg, og flytte statiske objekter rundt for å danne vegger og gulv. Du trenger ikke å holde grensene på scenen

Her er et eksempel på en av mine forsøk.

Klart, "å være en artist 'er ikke en forutsetning for denne opplæringen ..



Trinn 9: Bygg din Hero

Hva er en god platformer uten en overbevisende protagonist

Mens inne i World objekt, tegne et rektangel?. Føl deg fri til å gjøre noe kreativt her. Dette er det beste jeg kunne gjøre.

Konverter din karakter til et symbol, men ikke erklære en Base Class bare ennå

Høyreklikk den nye helten symbol i biblioteket.

Velg "Component definisjon ..."

I Class-feltet skriver wck.BodyShape



Trinn 10: Lag spiller Class

Åpne FlashDevelop.

Sørg for at prosjektet er åpent. I \\ src \\
mappe, lage en ny mappe som heter "Vis". I "Vis" opprette en ny mappe som heter "tegn. '

Høyre klikk" View "og Legg til ny klasse.

navn klassen noe som HeroCharacter.as Hotell og satt base klassen til shapes.Box

mappestrukturen skal nå se slik ut:.



Trinn 11: Overstyrer Opprett Method

Dette er inngangs punkt for å legge til funksjonalitet til figurene dine

Legg til følgende kode i vår nye klasse:
public class HeroCharacter strekker Box {private Var kontakter. Contact; offentlige styringsfunksjon skape (): void {reportBeginContact = true; reportEndContact = true; kontakter = ny Contact (); contacts.listenTo (denne); fixedRotation = true; listenWhileVisible (verden, StepEvent.STEP, world_stepEventHandler, falsk, 0, true); listenWhileVisible (dette, ContactEvent.BEGIN_CONTACT, this_beginContactHandler, falsk, 0, true); super.create (); }}

Ved å sette reportBeginContact og reportEndContact å true, setter vi eiendommer på BodyShape klasse. Vi er som indikerer at vi ønsker at BodyShape å ekspedere ContactEvents når kollisjoner begynne og når kollisjoner slutt. Vi deretter bruke et Contact og be den "listento dette". ContactList.listenTo (denne) skaper lyttere for ContactEvent.BEGIN_CONTACT og ContactEvent.END_CONTACT. Det skaper så handlers for hver som lagrer kollisjonen informasjon. Du kan se alt dette ved å sette markøren på Contact og trykke Ctrl + F4 i FlashDevelop.

Ved å sette fixedRotation å true, sikrer vi at vår helt ikke roterer forover eller bakover ved påkjørsel av stedene.

listenWhileVisible er en annen måte å legge hendelsen lyttere. Vi kunne ha brukt addEventListener (StepEvent.STEP, parseInput, falsk, 0, true); men den ekstra funksjonaliteten her er at listenWhileVisible vil fjerne hendelsen lyttere og utnevner dem for søppelrydding når Entity har blitt fjernet fra spillet. For vårt formål, er listenWhileVisible en mer optimalisert versjon av addEventListener. * Merk: Som med addEventListener, alltid bruke svake referanser slik at ubrukte objekter er kvalifisert for søppelrydding

Ved å bruke super.create () vi kaller lage () metoden på BodyShape.. Dette lar oss utvide funksjonaliteten til å lage () metoden i stedet for å erstatte den



Trinn 12:.. Håndter Player Input

La oss begynne med å lage vår StepEvent behandleren for spilleren innspill
privat funksjon world_stepEventHandler (e: StepEvent): void {}

På hvert tidsintervall, vil en StepEvent sendes fra b2World klasse i Box2D. Standard tid trinnet er .05 sekunder. Du kan endre timestep parameter enkelt ved å gå tilbake til Flash Professional og åpne verdensmesterskapet komponent parametere.

Deretter vil vi bruke Input verktøyet til å bestemme hvilke taster blir nå presset av brukeren.
Privat funksjon world_stepEventHandler (e: StepEvent): void {var venstre: Boolean = Input.kd ('venstre'); Var akkurat: Boolean = Input.kd ("rett"); Var jump: Boolean = Input.kp ('UP');}

Input.kd metoden kan godta flere argumenter. Så, hvis vi ønsket å la brukeren til å kunne kontrollere HeroCharacter med WASD og mellomromstasten, kan vi endre koden som følger:
privat funksjon world_stepEventHandler (e: StepEvent): void {var venstre: Boolean = Input .kd ('VENSTRE', 'A'); Var akkurat: Boolean = Input.kd ('HØYRE', 'D'); Var jump: Boolean = Input.kp ('UP', '', 'W'); }

Input.kd () lytter etter når en tast er nede, mens Input.kp () lytter til umiddelbar trykker på en tast



Trinn 13:. Påfør Impulse å flytte spilleren

Når impulsen påføres et stivt legeme, fremdrift av legemet endres. Momentum er produktet av masse og hastighet. . Så når vi ønsker å endre hastighet (hastighet og retning) av vår spiller, vil vi bruke en metode på b2body kalt ApplyImpulse ()
privat funksjon world_stepEventHandler (e: StepEvent): void {var venstre: Boolean = Input. kd ('VENSTRE', 'A'); Var akkurat: Boolean = Input.kd ('HØYRE', 'D'); Var jump: Boolean = Input.kp ('UP', '', 'W'); if (hopp) {b2body.ApplyImpulse (ny V2 (0, -2), b2body.GetWorldCenter ()); } Else if (venstre) {b2body.ApplyImpulse (ny V2 (-2, 0), b2body.GetWorldCenter ()); } Else if (høyre) {b2body.ApplyImpulse (ny V2 (2, 0), b2body.GetWorldCenter ()); }}

ApplyImpulse () tar to parametere: verden impuls vektor og påføringspunktet av impuls. For nå, vil vi passere en ny 2D vektor som første parameter for hopping, flytte seg til venstre og høyre (vi må gjøre en justering av hvordan vi håndterer hoppe litt senere). Den andre parameteren for hver ApplyImpulse metode er b2body.GetWorldCenter (). Denne metoden returnerer verden posisjonen til sentrum massen av vår helt. Dette er viktig fordi ApplyImpulse vil forandre vår helts vinkelhastighet hvis det ikke handle på hans senter masse (dette er også grunnen til at vi brukte sentrum registrering på helten i Flash).



Trinn 14: Deal med Normal Force

Gå tilbake til Flash Professional og angi Hero symbol sin klasse til "view.characters.HeroCharacter" og la Base Class blank. Deretter satt forekomsten navnet på Hero eksempel til "helten".

I komponent parametere of the World komponent, fjerner du merket 'allowDragging "og velg" rulle ". På denne måten vil brukeren ikke kunne dra karakteren din rundt med musen, og kameraet vil følge spilleren når han beveger seg. Til slutt, i "focusOn-feltet, skriv inn" helten ", din Hero forekomsten navn.

Trykk Ctrl + Enter for å teste filmen. Du vil merke at du kan bevege figuren din rundt ved å trykke på venstre og høyre og kan hoppe med plass. Men hvis du fortsetter å trykke på plass, vil du holde hoppe opp på ubestemt tid.

Grunnen til at vi ikke kan holde hoppe opp på ubestemt tid er at når vi er i lufta, er det ingenting for våre føtter å presse på for å støte oss opp. Det er ingen med like stor kraft på beina presser tilbake. Når vi er godt plantet på bakken, er den kraft som hjelper oss i å hoppe oppover og holder oss fra å falle gjennom gulvet kalles normal kraft. Det vi trenger å gjøre er å finne ut hva normalkraften er på spillernes våre føtter. Hvis det ikke er normal kraft, da han ikke kan ta et hopp. Vi vil gjøre det ved å gjøre bruk av vår Contact.

Gå tilbake til FlashDevelop. La oss endre vår trinn hendelseshåndterer gang:
privat funksjon world_stepEventHandler (e: StepEvent): void {var mange: b2WorldManifold = null; hvis {manifold = getNormalForce () (contacts.isEmpty ()!); } Var venstre: Boolean = Input.kd ('VENSTRE', 'A'); Var akkurat: Boolean = Input.kd ('HØYRE', 'D'); Var jump: Boolean = Input.kp ('UP', '', 'W'); if (hopp & & manifold) {var v: V2 = manifold.normal.multiplyN (-3); b2body.ApplyImpulse (v, b2body.GetWorldCenter ()); } Else if (venstre) {b2body.ApplyImpulse (ny V2 (- 5, 0), b2body.GetWorldCenter ().); } Else if (høyre) {b2body.ApplyImpulse (ny V2 (0,5, 0), b2body.GetWorldCenter ()); }}

Vi skal skrive koden for getNormalForce () metoden i løpet av et sekund. Hva vi ønsker å gjøre her er å se etter kontakter (er vår spiller berører noe?) Får en manifold som beskriver hvor vår spiller berører en kontakt (på siden eller bunnen) og akselerere spilleren oppover hvis han gjør kontakt med bakken. Hvis det ikke er noen kontakter, må vår helt være i luften. I så fall ville manifolden være null og spilleren ville være ute av stand til å hoppe

La oss nå skrive getNormalForce () -metoden
privat funksjon getNormalForce ():.. B2WorldManifold {var mange: b2WorldManifold = null; contacts.forEach (funksjon (taster: Array, contactEvent: ContactEvent) {var tempManifold: b2WorldManifold = contactEvent.getWorldManifold (); if (tempManifold.normal.y > 0) {tempManifold.normal = new V2 (0, tempManifold.normal .Y); manifold = tempManifold;}}); contacts.clean (); returnere manifold;}

Før du ringer getNormalForce (), sjekker vi for å se om vår spiller er i kontakt med noe. Hvis han ikke er det, da vet vi at han er i luften. Hele grunnen denne funksjonen finnes er å hindre spilleren fra å ta en andre hoppe ut av en vegg eller på siden av en plattform.

Først erklærer vi en lokal variabel kalt manifold og sette den til null. Dette er den parameteren vi skal komme tilbake. Hvis helten karakter er i kontakt med noe på sin høyre venstre eller øverst (men ikke bakken) denne funksjonen vil returnere en null manifold.

Ved hjelp av metoden contacts.forEach (), kan vi sjekke hver ContactEvent i vårt Contact. Alle ContactEvents har en worldManifold eiendom. Så vi opprette en annen lokal variabel kalt tempManifold og sett den til den returnerte verdien av hver contactEvent.GetWorldManifold. Deretter sjekker vi for å se om temp.normal.y er større enn null. Her vi spør, er det y-aksen normal kraft?

Hvis helten er på bakken eller en plattform, null vi ut noen x-aksen normal kraft. Unnlatelse av å gjøre dette resulterer i buggy hopping når spilleren er presset opp mot en vegg. Føl deg fri til å eksperimentere med dette. Hvis du ikke nullstille x, får spilleren en kul (ennå upålitelig) slags Metroid vegg-hopp evne.

Til slutt rengjøre Contact. Vi ønsker ikke å håndtere de samme kontaktene mer enn en gang



Trinn 15:. Legg Mynter

Nå som vi har en hovedperson som kan løpe rundt og hoppe, la oss legge til noen elementer som han kan plukke opp. Gå tilbake til Flash Professional, tegne en sirkel eller ellipse for en mynt og konvertere den til et symbol. Sett Class og Base klasse som vist:

Sett så mange forekomster av Coin klasse som du vil på scenen. I Komponent Parametere, satt jeg hver mynt er typen til å være statisk, slik at de er upåvirket av tyngdekraften, og kan flyte på plass som i Mario, men det er opp til deg.



Trinn 16: Handle Kollisjoner med mynter

Akkurat nå myntene er urokkelige, statiske objekter. Vi ønsker å endre det. Gå tilbake til FlashDevelop og åpne HeroCharacter klassen. Legg en hendelseshåndterer for kollisjoner som dette:
privat funksjon this_beginContactHandler (e: ContactEvent): void {}

Dette er behandleren for lytteren som vi opprettet i trinn 11. Legg til følgende kode:
privat funksjon this_beginContactHandler (e: ContactEvent): void {var mynt: Coin = e.other.m_userData som Coin; if (mynt) {coin.remove (); }}

Først lager vi en lokal Var kalles mynt som er av samme type som den Coin klasse du opprettet i Flash. ContactEvent holder styr på den andre Box2D ligaen involvert i kollisjonen. Hvis det er Coin, fjerner vi det fra scenen, noe som gir en illusjon av at det har blitt samlet



Trinn 17:. Hold Score

Lag en mappe inne i \\ src \\ katalogen kalt "modell". Inside 'modell' lage en mappe som heter "resultattavle" og lage en ny klasse kalt resultattavle som strekker EventDispatcher. Siden vi bare ønsker å noensinne ha én forekomst av resultattavle rundt på en gang, vi kommer til å følge Singleton design mønsteret. Det var en rask spiss om Singleton mønster på Activetuts + tidligere i år hvis du vil ha en referanse

Skriv inn følgende kode i målprotokollen for hjemmelaget klasse.
Pakke model.scoreboard {import flash.errors.IllegalOperationError; import flash.events.Event; import flash.events.EventDispatcher; public class protokollføreren strekker EventDispatcher {private static Var _instance: medhjelperen; offentlig funksjon protokollføreren () {if (! _instance = null) {kaste nytt IllegalOperationError ("Bruk ScoreBoard.getInstance () for å få en henvisning til Singleton protokollføreren."); } Else {initial (); }} Privat funksjon initialize (): void {} public static funksjon getInstance (): protokollføreren {if (_instance == null) _instance = new protokollføreren (); returnere _instance; }}}

Dette er Singleton mønster. Vi forventer en klasse som ønsker å få tilgang til protokollføreren å bruke statisk funksjon getInstance (). Hvis en forekomst finnes allerede og noen (annen utvikler på laget ditt, for eksempel) prøver å bruke protokollføreren gjennom sin konstruktør, vil de motta vår feilmelding som forteller dem at protokollføreren skal kun være tilgjengelige gjennom getInstance ().
< p> protokollføreren strekker EventDispatcher slik at den kan sende hendelser når poengsummen endringer. Vi vil bygge en score board som en visning komponent som vil abonnere på protokollføreren hendelser.

Nå må vi protokollføreren å faktisk begynne å holde stillingen. Vi trenger en variabel for å holde stillingen, en metode som øker poengsummen, en getter for resultatet så at andre klasser kan få tilgang til det, og en public static konst å lagre Event type.
Pakke model.scoreboard {import flash. errors.IllegalOperationError; import flash.events.Event; import flash.events.EventDispatcher; public class protokollføreren strekker EventDispatcher {public static konst SCORE_CHANGED: String = "SCORE_CHANGED"; private Var _score: UINT; privat Static Var _instance: medhjelperen; offentlig funksjon protokollføreren () {if (! _instance = null) {kaste nytt IllegalOperationError ("Bruk ScoreBoard.getInstance () for å få en henvisning til Singleton protokollføreren."); } Else {initial (); }} Privat funksjon initialize (): void {_score = 0; } Offentlig funksjon incrementScore (): void {_score ++; dispatchEvent (ny hendelse ("SCORE_CHANGED")); } Public static funksjon getInstance (): protokollføreren {if (_instance == null) _instance = new protokollføreren (); returnere _instance; } Offentlig funksjon får poeng (): uint {return _score; }}}

Og det er alt vi trenger for vår protokollføreren. Nå la oss gjøre en visning komponent for å vise resultatet nummeret. Gå inn i Flash og på scenen (ikke inne i World symbol) trekke ut en resultattavle. Det eneste viktige her er at du bruker tekstverktøyet til å tegne en Textfield med forekomstnavnet "score". Konvertere tekstfeltet til et filmklipp symbol kalt resultattavlen.

Tilbake i FlashDevelop, i verden mappen oppretter en klasse som heter "ScoreDisplay" som strekker MovieClip. Alt vi trenger å gjøre her er å få en forekomst av medhjelperen og abonnere på sine arrangementer. Det skal se slik ut:
pakken view.world {import flash.display.MovieClip; import flash.events.Event; import flash.text.TextField; import model.scoreboard.ScoreKeeper; public class ScoreDisplay strekker MovieClip {private Var _scoreKeeper: protokollføreren = ScoreKeeper.getInstance (); offentlig funksjon ScoreDisplay () {this.score.text = "0"; _scoreKeeper.addEventListener (ScoreKeeper.SCORE_CHANGED, scoreBoard_ScoreChangedHandler, falsk, 0, true); } Private funksjon scoreBoard_ScoreChangedHandler (e: Hendelses): void {this.score.text = _scoreKeeper.score.toString (); }}}

Gå tilbake til Flash og åpne egenskapene Stillingen symbol i biblioteket. Endre klasse til view.world.ScoreDisplay.

Du har én siste trinnet. Gå tilbake til HeroCharacter klassen og legge til to linjer med kode:
privat funksjon this_beginContactHandler (e: ContactEvent): void {var mynt: Coin = e.other.m_userData som Coin; if (mynt) {coin.remove (); scoreBoard.incrementScore (); }} public class HeroCharacter strekker Box {private Var kontakter: Contact; private Var protokollføreren: protokollføreren = ScoreKeeper.getInstance ();



Trinn 18: Legg Statiske Platforms

Gå inn Flash professsional og plassere en forekomst av StaticBox (det samme som vi brukte til å lage vegger og gulvet) innenfor World eksempel. Sørg for at du setter sitt slag til statisk i komponenten Parametere og at plattformen er lav nok til at spilleren kan hoppe til det



Trinn 19:. Legg Suspendert plattformer med Box2D ledd
< p> WCK gjør lage svingende plattformene veldig enkelt. Vi kan gjøre hele greia i Flash IDE uten å skrive kode.

Start med å tegne en sirkel. Konvertere sirkelen til et symbol kalt Joint og sett Base Class til wck.Joint. Deretter høyreklikker du på Joint symbol på biblioteket og gå til Komponent Definisjon av. Sett klasse som wck.Joint. I panelet Egenskaper, sett eksempel navn som anker og i Component Parametere, endre typen revolute. Dette er felles som vil gi vår plattform en pendling.

Tegn en plattform med rektangelverktøyet. Velg den og konvertere den til et symbol. Sett Base Class til extras.Platform. Høyreklikk på symbolet i biblioteket og i Component Definition, sett klasse til extras.Platform.

Dra ut to flere forekomster av Joint klasse i verden og sett hver og en i hver ende av plattformen. Oppsettet skal se slik ut:

For hvert nytt Joint eksempel gå inn Komponent Parametere og endringstype til "Avstand" og i target2Name feltet skrive 'anker'. Test filmen, og du bør ha en svingende plattform



Trinn 20:. Legg Enemies

I FlashDevelop, legge til en ny klasse til de \\ tegnene \\ mappe kalt EnemyCharacter. Her er koden vi kommer til å skrive (dette vil se veldig kjent):
pakke view.characters {import Box2DAS.Common.V2; import Box2DAS.Dynamics.ContactEvent; import Box2DAS.Dynamics.StepEvent; import shapes.Box; import wck.ContactList; public class EnemyCharacter strekker Box {private Var kontakter: Contact; private Var venstre: Boolean = true; private Var akkurat: Boolean; offentlige styringsfunksjon skape (): void {fixedRotation = true; reportBeginContact = true; super.create (); kontakter = ny Contact (); contacts.listenTo (denne); listenWhileVisible (verden, StepEvent.STEP, world_stepEventHandler, falsk, 0, true); listenWhileVisible (dette, ContactEvent.BEGIN_CONTACT, this_beginContactHandler, falsk, 0, true); } Private funksjon world_stepEventHandler (e: StepEvent): void {if (venstre) {b2body.ApplyImpulse (. Ny V2 (- 1, 0), b2body.GetWorldCenter ()); } Else if (høyre) {b2body.ApplyImpulse (ny V2 (0,1, 0), b2body.GetWorldCenter ()); }} Privat funksjon this_beginContactHandler (e: ContactEvent): void {var veggen: StaticBox = e.other.m_userData som StaticBox; if (vegg) {venstre = venstre!; høyre = høyre!; }}}}

Det eneste nye her er at hver gang objektet kolliderer med en vegg, endrer den retning. Og hvert trinn hendelse, fienden tegnet kommer til å ha en impuls overført i retning han står overfor.

Gå tilbake til Flash og tegne en fiende karakter, og konvertere den til et symbol med Base Class satt til view.characters.EnemyCharacter og klasse satt til Enemy.

Det siste vi trenger å gjøre er håndtaket kontakt mellom spilleren tegnet og fienden karakter. I HeroCharacter klassen, legge til følgende kode:
privat funksjon this_beginContactHandler (e: ContactEvent): void {var mynt: Coin = e.other.m_userData som Coin; trace (mynt); if (mynt) {coin.remove (); scoreKeeper.incrementScore (); } Else {var fienden: EnemyCharacter = e.other.m_userData som EnemyCharacter; if (fiende) {var tempManifold: b2WorldManifold = e.getWorldManifold (); if (tempManifold.normal.y > 0) {Util.addChildAtPosOf (verden, ny BadGuyFX (), fiende); enemy.remove (); }}}}

Hvis vår helt kommer i kontakt med noe, og det er ikke en mynt, vil vi sjekke om det er den EnemyCharacter. Hvis det er, vil vi sjekke manifolden av ContactEvent å avgjøre om vi treffer slemmingen på toppen eller på siden. Hvis vi hoppet oppå ham, vil han bli fjernet fra scenen.

Jeg ønsket å legge en animasjon av EnemyCharacter bli klemt så i Flash jeg gjort et filmklipp med en tidslinje animasjon av fienden å bli knust . Jeg satt Base Class of som BadGuyFX objekt til misc.FX, en klasse i WCK biblioteket som spiller gjennom sin egen tidslinje animasjon gang og deretter setter seg til null. Så jeg lagt den til Stage med Util metoden addChildAtPosOf (). Animasjonen gjør fienden fjerning ikke synes så plutselig.



Konklusjon

Nå som du har en fungerende prototype av et plattformspill, oppfordrer jeg deg til å holde utforske hva WCK har å tilby. Jeg anbefaler spesielt å spille rundt i komponenten Parametere av spillobjekter. Dette er en veldig morsom og rask måte å endre fysikken i spillet verden uten å skrive kode. Jeg håper du likte denne opplæringen! Takk for lesing!