Bouw een op fysica gebaseerde platformgame in minder dan een uur

In deze tutorial leer je om een ​​op fysica gebaseerd platformspel op de snelst mogelijke manier te maken met de World Construction Kit.


Eindresultaat voorbeeld

Laten we eens kijken naar het eindresultaat waar we naartoe zullen werken:

Het is een beetje rommelig, maar dat kan worden opgelost - en wacht tot je ziet hoe snel en eenvoudig het was om te maken!


Stap 1: downloaden

Download de Box2D Alchemy Port- en WCK-bibliotheken. Download de bron van github en kijk voor meer informatie op www.sideroller.com.


Stap 2: Nieuw FlashDevelop-project

Klik op 'Project' en selecteer 'Nieuw project' in de lijst. kiezen AS3-project als uw projectsjabloon, geef een naam aan uw project, wijs het naar een lege map en klik op OK.

Lokaliseer de Box2D / WCK-bibliotheken die u in stap 1 hebt gedownload en plaats de volgende mappen in de map 'lib' van uw nieuwe project: Box2D, Box2DAS, extras, zwaartekracht, misc, vormen, en WCK.

Klik nogmaals op 'Project' en selecteer Eigenschappen. Klik op het tabblad 'Klassenpaden' en voeg uw lib-map toe.

Open Main.as in het bronbestand en voeg de gemarkeerde code toe. FlashDevelop had de rest automatisch moeten genereren.

 public class Main breidt WCK uit public function Main (): void if (stage) init (); else addEventListener (Event.ADDED_TO_STAGE, init);  private function init (e: Event = null): void removeEventListener (Event.ADDED_TO_STAGE, init); // ingangspunt  

Stap 3: Stel de Flash-IDE in

Open Flash Professional. Druk op Ctrl + Shift + F12 om Publicatie-instellingen te openen. Klik op het tabblad Flash. Selecteer de optie 'Export SWC'

? en klik vervolgens op de instellingen knop naast de ActionScript 3.0 combobox.

Klik op het tabblad Bronpad op het pictogram 'Bladeren naar pad' en selecteer uw lib map. Klik vervolgens op het tabblad Bibliotheekpad en selecteer het pictogram 'Browse to SWC'. Selecteer het bestand lib / Box2DAS / Box2D.swc.

Klik op OK in Geavanceerde acties Script 3 en nogmaals op het venster Publicatie-instellingen. Sla uw FLA op in de map \ src \ van uw FlashDevelop-project (dezelfde map met Main.as).

Druk ten slotte op Ctrl + F3 om de documenteigenschappen te openen en de documentklasse in te stellen op Hoofdgroep.


Stap 4: uw eerste wereldobject

Begin met het gereedschap Rechthoek om een ​​rechthoek op het werkgebied te tekenen.

Converteer de rechthoek naar een symbool door het te selecteren en op F8 te drukken.

Stel het registratiepunt in op het midden. * Opmerking: het is erg belangrijk dat je alle spelsymbolen op deze manier registreert. Als u dit niet doet, heeft dit invloed op hoe uw object reageert op zwaartekracht en botsingen.

Klik op 'exporteren voor Actionscript' en stel de basisklasse in shapes.Box


Stap 5: Creëer de wereld

Dit lijkt misschien contra-intuïtief, dat je een wereldobject hebt gemaakt voordat je je wereld maakte. Je zou het op beide manieren kunnen doen, maar je zult zien dat het sneller is om het op deze manier te doen.

Selecteer uw Static Box-object op het podium en druk op F8.

Net zoals je deed met de Static Box, zet je het registratiepunt van de wereld in het midden en controleer je Exporteren voor ActionScript.

Stel de basisklasse in op wck.World


Stap 6: Definieer Wereldcomponent

Klik met de rechtermuisknop op uw nieuwe World-symbool in de bibliotheek.

Selecteer "Componentdefinitie?"

Typ in het veld Class wck.World

Dit is een belangrijk verkoopargument voor de World Construction Kit. Als u nu op het World-object op het werkvlak klikt en het eigenschappenvenster opent door op Ctrl + F3 te drukken, kunt u een groot aantal van de inspecteerbare eigenschappen van de World-component bewerken onder de kop 'Componentparameters'..


Stap 7: Definieer een statisch objectcomponent

Ok, nu gaan we hetzelfde doen met ons statische object.

Klik met de rechtermuisknop op uw Static Box-symbool in de bibliotheek.

Selecteer "Componentdefinitie?"

Typ in het veld Class wck.BodyShape

Open het eigenschappenvenster door het Static Box-object op het werkvlak te selecteren en op Ctrl + F3 te drukken.

Blader naar het venster Componentparameters naar beneden en wijzig het 'type' van dynamisch in statisch. Als u dit vergeet, worden uw statische componenten (muren, vloeren, platforms) onderhevig aan zwaartekracht en vallen ze tijdens runtime van het scherm.


Stap 8: Bouw de vloer en muren

Selecteer uw statische object in de wereld. Kopieer en plak het een paar keer.

Selecteer elke instantie van statisch object en gebruik 'Vrije transformatie' om uw statische objecten uit te rekken, scheeftrekken en te verplaatsen om muren en een vloer te vormen. Je hoeft de grenzen niet op het podium te houden.

Hier is een voorbeeld van een van mijn pogingen:

Het is duidelijk dat 'kunstenaar zijn' geen vereiste is voor deze tutorial?


Stap 9: Bouw je held!

Wat is een goede platformgame zonder een boeiende hoofdrolspeler?

Teken binnen het object World een rechthoek. Voel je vrij om creatief te worden hier. Dit is het beste wat ik kon doen:

Converteer je karakter naar een symbool, maar verklaar nog geen Base Class.

Klik met de rechtermuisknop op uw nieuwe Helden-symbool in de bibliotheek.

Selecteer "Componentdefinitie?"

Typ in het veld Class wck.BodyShape


Stap 10: Maak de spelersklasse

Open FlashDevelop.

Zorg ervoor dat je project open is. In de \ Src \ map, maak een nieuwe map met de naam 'Beeld'. Maak in 'View' een nieuwe map met de naam 'Characters'.

Klik met de rechtermuisknop 'Beeld' en voeg nieuwe klasse toe.

Geef je klas een naam als HeroCharacter.as en stel de basisklasse in op shapes.Box.

Uw mappenstructuur zou er nu als volgt uit moeten zien:


Stap 11: Negeer de Aanmaakmethode

Dit is het beginpunt voor het toevoegen van functionaliteit aan uw personages.

Voeg de volgende code toe aan onze nieuwe les:

 openbare klasse HeroCharacter verlengt Box private var contacts: ContactList; public override function create (): void reportBeginContact = true; reportEndContact = true; contacten = nieuwe ContactList (); contacts.listenTo (deze); fixedRotation = true; listenWhileVisible (world, StepEvent.STEP, world_stepEventHandler, false, 0, true); listenWhileVisible (this, ContactEvent.BEGIN_CONTACT, this_beginContactHandler, false, 0, true); super.create (); 

Door in te stellen reportBeginContact en reportEndContact naar waar, we bepalen eigenschappen op de Lichaamsvorm klasse. We geven aan dat we graag de Lichaamsvorm uitzenden ContactEvents wanneer botsingen beginnen en wanneer botsingen eindigen. We maken vervolgens een a Contactlijst en vraag het om "luisteren naar deze". ContactList.listenTo (de) creëert luisteraars voor ContactEvent.BEGIN_CONTACT en ContactEvent.END_CONTACT. Vervolgens worden er handlers gemaakt voor elk die de collision-informatie opslaat. Je kunt dit allemaal zien door je cursor op te zetten Contactlijst en druk op Ctrl + F4 in FlashDevelop.

Door in te stellen fixedRotation naar waar, we zorgen ervoor dat onze held niet naar voren of naar achteren draait als hij botst met objecten.

listenWhileVisible is een andere manier om gebeurtenislisteners toe te voegen. We hadden het kunnen gebruiken addEventListener (StepEvent.STEP, parseInput, false, 0, true); maar de toegevoegde functionaliteit hier is dat listenWhileVisible zal de gebeurtenislisteners verwijderen en ze aanwijzen als garbagecollection wanneer het Entiteit is verwijderd uit het spel. Voor onze doeleinden, listenWhileVisible is een meer geoptimaliseerde versie van addEventListener. * Opmerking: zoals bij addEventListener, gebruik altijd zwakke referenties zodat ongebruikte objecten in aanmerking komen voor garbagecollection.

Door het gebruiken van super.create () we noemen het create () methode op Lichaamsvorm. Hiermee kunnen we de functionaliteit van de. Uitbreiden create () methode in plaats van deze te vervangen.


Stap 12: gebruik de speler-invoer

Laten we beginnen met het maken van onze StepEvent handler voor invoer van spelers.

 private function world_stepEventHandler (e: StepEvent): void 

Op elk tijdsinterval, a StepEvent zal worden verzonden vanuit de b2World les in Box2D. De standaardtijdstap is 0,05 seconden. U kunt de tijd stap parameter eenvoudig door terug te gaan naar Flash Professional en de componentenparameters Wereld te openen.

Vervolgens zullen we het Input-hulpprogramma gebruiken om te bepalen welke toetsen momenteel door de gebruiker worden ingedrukt.

 private function world_stepEventHandler (e: StepEvent): void var left: Boolean = Input.kd ('LEFT'); var right: Boolean = Input.kd ('RIGHT'); var jump: Boolean = Input.kp ('UP'); 

De Input.kd-methode kan meerdere argumenten accepteren. Dus als we de gebruiker in staat wilden stellen om het HeroCharacter met WASD en de spatiebalk te kunnen besturen, kunnen we de code als volgt wijzigen:

 private function world_stepEventHandler (e: StepEvent): void var left: Boolean = Input.kd ('LEFT', 'A'); var right: Boolean = Input.kd ('RIGHT', 'D'); var jump: Boolean = Input.kp ('UP', ',' W ');

Input.kd () luistert naar wanneer een sleutel is ingedrukt, terwijl Input.kp () luistert naar het moment waarop een toets wordt ingedrukt.


Stap 13: Impulse toepassen om de speler te verplaatsen

Wanneer een impuls wordt toegepast op een rigide lichaam, wordt het momentum van het lichaam veranderd. Momentum is het product van massa en snelheid. Dus als we de snelheid (snelheid en richting) van onze speler willen veranderen, zullen we een methode gebruiken b2body riep ApplyImpulse ().

 private function world_stepEventHandler (e: StepEvent): void var left: Boolean = Input.kd ('LEFT', 'A'); var right: Boolean = Input.kd ('RIGHT', 'D'); var jump: Boolean = Input.kp ('UP', ',' W '); if (jump) b2body.ApplyImpulse (new V2 (0, -2), b2body.GetWorldCenter ()); else if (left ) b2body.ApplyImpulse (nieuwe V2 (-2, 0), b2body.GetWorldCenter ()); else if (right) b2body.ApplyImpulse (new V2 (2, 0), b2body.GetWorldCenter ());

ApplyImpulse () accepteert twee parameters: de wereldimpulsvector en het punt van toepassing van de impuls. Voor nu zullen we een nieuwe 2D-vector doorgeven als de eerste parameter voor springen, naar links en naar rechts verplaatsen (we moeten een aanpassing maken aan hoe we later met springen omgaan). De tweede parameter voor elk ApplyImpulse methode is b2body.GetWorldCenter (). Deze methode retourneert de wereldpositie van de middelste massa van onze held. Dit is belangrijk omdat ApplyImpulse zal de hoeksnelheid van onze held veranderen als deze niet werkt op zijn middelste massa (dit is ook de reden waarom we in Flash de registratie van het centrum op de held hebben gebruikt).


Stap 14: Deal met normale kracht

Ga terug naar Flash Professional en stel de klasse Held in op "view.characters.HeroCharacter" en laat de basisklasse leeg. Stel vervolgens de instantienaam van uw Hero-instantie in op 'held'.

Schakel in de componentparameters van de component Wereld de optie 'allowDragging' uit en selecteer 'scrollen'. Op deze manier kan de gebruiker je personage niet met de muis rondslepen en de camera zal je speler volgen wanneer hij beweegt. Ten slotte typt u in het veld 'focusOn' 'hero', de naam van uw Hero-instantie.

Druk op Ctrl + Enter om de film te testen. Je zult merken dat je je personage kunt verplaatsen door op links en rechts te drukken en met ruimte kunt springen. Maar als je op de spatie blijft drukken, blijf je voor altijd springen.

De reden waarom we niet oneindig lang kunnen blijven springen, is dat als we eenmaal in de lucht zijn, er niets is dat we kunnen opduwen om ons op te steken. Er is geen gelijke kracht aan onze voeten die terugdringt. Wanneer we stevig op de grond worden geplant, wordt de kracht die ons helpt omhoog te springen en ons ervan weerhoudt om door de vloer te vallen, normaalkracht genoemd. Wat we moeten doen is bepalen wat de normale kracht is op de voeten van onze spelers. Als er geen normale kracht is, kan hij geen sprong maken. We doen dat door gebruik te maken van onze Contactlijst.

Ga terug naar FlashDevelop. Laten we onze step event handler nog een keer aanpassen:

 private function world_stepEventHandler (e: StepEvent): void var manifold: b2WorldManifold = null; if (! contacts.isEmpty ()) manifold = getNormalForce ();  var left: Boolean = Input.kd ('LEFT', 'A'); var right: Boolean = Input.kd ('RIGHT', 'D'); var jump: Boolean = Input.kp ('UP', ',' W '); if (jump && manifold) var v: V2 = manifold.normal.multiplyN (-3); b2body.ApplyImpulse (v, b2body. GetWorldCenter ()); else if (links) b2body.ApplyImpulse (nieuwe V2 (-. 5, 0), b2body.GetWorldCenter ()); else if (right) b2body.ApplyImpulse (new V2 (.5, 0), b2body.GetWorldCenter ());

We zullen de code schrijven voor de getNormalForce () methode in slechts een seconde. Wat we hier willen doen is zoeken naar contacten (raakt onze speler iets aan?) Krijgt een veelvoud waarin wordt beschreven waar onze speler een contact aanraakt (aan de zijkant of onderkant) en versnelt de speler omhoog als hij contact maakt met de grond. Als er geen contacten zijn, moet onze held in de lucht zijn. In dat geval zou het spruitstuk nul zijn en zou de speler niet kunnen springen.

Laten we nu de getNormalForce () methode.

 private function getNormalForce (): b2WorldManifold var manifold: b2WorldManifold = null; contacts.forEach (function (keys: 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 (); terugvoer spruitstuk; 

Voordat je belt getNormalForce (), we controleren om te zien of onze speler ergens mee in contact staat. Als hij dat niet is, weten we dat hij in de lucht is. De hele reden waarom deze functie bestaat, is om te voorkomen dat de speler een tweede sprong van een muur of de zijkant van een platform neemt.

Eerst declareren we een lokale variabele genaamd verdeelstuk en zet het op nul. Dit is de parameter die we zullen teruggeven. Als het personage van de held in contact is met iets links of bovenaan (maar niet met de grond), retourneert deze functie een leeg spruitstuk.

De methode gebruiken contacts.forEach (), we kunnen elk ContactEvent in onze Contactlijst bekijken. Alle ContactEvents hebben een worldManifold-eigenschap. We maken dus een andere lokale variabele met de naam tempManifold en stellen deze in op de waarde die wordt geretourneerd door elk contactEvent.GetWorldManifold. Vervolgens controleren we om te zien of temp.normal.y groter is dan nul. Hier vragen we ons af of er een y-as normale kracht is?

Als de held op de grond of een platform staat, halen we de normale kracht van de x-as weg. Als u dit niet doet, resulteert dit in buggy-springen wanneer de speler tegen een muur wordt geduwd. Voel je vrij om hiermee te experimenteren. Als je de x niet op nul zet, krijgt de speler een cool (maar onbetrouwbaar) soort Metroid wall-jump-vaardigheid.

Maak ten slotte de Contactlijst schoon. We willen niet meer één keer met dezelfde contacten omgaan.


Stap 15: voeg munten toe

Nu we een protagonist hebben die rond kan rennen en springen, laten we wat items toevoegen die hij kan ophalen. Ga terug naar Flash Professional, teken een cirkel of ellips voor een munt en converteer deze naar een symbool. Stel de klasse en de basisklasse in zoals getoond:

Zet zo veel exemplaren van de muntenklasse als je wilt in het werkgebied. In Componentparameters, stel ik het type van elke munt in statisch zodat ze niet worden beïnvloed door de zwaartekracht en op hun plaats blijven drijven zoals in Mario, maar het is aan jou.


Stap 16: Omgaan met botsingen met munten

Op dit moment zijn de munten onbeweegbare, statische objecten. Dat willen we graag veranderen. Ga terug naar FlashDevelop en open de HeroCharacter klasse. Voeg een gebeurtenishandler toe voor botsingen als deze:

 privéfunctie this_beginContactHandler (e: ContactEvent): void 

Dit is de handler voor de luisteraar die we in stap 11 hebben gemaakt. Voeg de volgende code toe:

 privéfunctie this_beginContactHandler (e: ContactEvent): void var coin: Coin = e.other.m_userData as Coin; als (munt) coin.remove (); 

Eerst maken we een lokale var genaamd munt dat is hetzelfde type als de muntklasse die je in Flash hebt gemaakt. ContactEvent houdt bij welke andere Box2D-fixture bij de botsing is betrokken. Als het Coin is, verwijderen we het uit het werkgebied, waardoor we de illusie krijgen dat het is verzameld.


Stap 17: Score houden

Maak een map in de \ src \ map met de naam 'model'. Maak binnen 'model' een map met de naam 'scorebord' en maak een nieuwe klasse genaamd Scorebord dat breidt zich uit EventDispatcher. Aangezien we slechts één instantie van het scorebord ooit in één keer willen hebben, gaan we het Singleton-ontwerppatroon volgen. Er was eerder dit jaar een Quick Tip over het Singleton-patroon op Activetuts + als je een referentie wilt.

Schrijf de volgende code in de ScoreBoard-klasse:

 pakket model.scoreboard import flash.errors.IllegalOperationError; import flash.events.Event; import flash.events.EventDispatcher; public class ScoreKeeper breidt EventDispatcher uit private static var _instance: ScoreKeeper; public function ScoreKeeper () if (_instance! = null) gooi nieuwe IllegalOperationError ("Gebruik ScoreBoard.getInstance () om een ​​verwijzing naar de Singleton ScoreKeeper te krijgen.");  else initialize ();  persoonlijke functie initialize (): void  public static function getInstance (): ScoreKeeper if (_instance == null) _instance = new ScoreKeeper (); return _instance; 

Dit is het Singleton-patroon. We verwachten dat elke Klasse die de ScoreKeeper wil gebruiken om de statische functie te gebruiken getInstance (). Als een exemplaar al bestaat en iemand (een andere ontwikkelaar in uw team, bijvoorbeeld) probeert de ScoreKeeper via zijn constructor te instantiëren, ontvangen zij onze foutmelding dat de ScoreKeeper alleen toegankelijk moet zijn via getInstance ().

De ScoreKeeper breidt EventDispatcher uit zodat het evenementen kan verzenden wanneer de score verandert. We zullen een scorebord bouwen als een weergavecomponent die zich abonneert op de ScoreKeeper-evenementen.

Nu hebben we de ScoreKeeper nodig om daadwerkelijk te beginnen met het bijhouden van de score. We hebben een variabele nodig om de score te houden, een methode die de score verhoogt, een getter voor de score, zodat andere klassen er toegang toe hebben en een openbare statische const om ons evenementtype op te slaan.

pakket model.scoreboard import flash.errors.IllegalOperationError; import flash.events.Event; import flash.events.EventDispatcher; public class ScoreKeeper breidt EventDispatcher uit public static const SCORE_CHANGED: String = "SCORE_CHANGED"; privé var _score: uint; private static var _instance: ScoreKeeper; public function ScoreKeeper () if (_instance! = null) gooi nieuwe IllegalOperationError ("Gebruik ScoreBoard.getInstance () om een ​​verwijzing naar de Singleton ScoreKeeper te krijgen."); else initialize (); persoonlijke functie initialize (): void _score = 0; publieke functie incrementScore (): void _score ++; dispatchEvent (nieuwe gebeurtenis ("SCORE_CHANGED")); public static function getInstance (): ScoreKeeper if (_instance == null) _instance = new ScoreKeeper (); return _instance; public function get score (): uint return _score;

En dat is alles wat we nodig hebben voor onze ScoreKeeper. Laten we nu een weergavecomponent maken om het scoreaantal weer te geven. Ga naar Flash en op het podium (niet binnen het World-symbool) teken je een scorebord. Het enige belangrijke ding hier is dat je de Text Tool gebruikt om een ​​TextField te tekenen met de instantienaam 'partituur'. Converteer het TextField naar een genoemd filmclipsymbool Scorebord.

Terug in FlashDevelop, maak in de wereldmap een Class genaamd 'ScoreDisplay' die MovieClip uitbreidt. Het enige dat we hier moeten doen is een exemplaar van ScoreKeeper aanschaffen en zich abonneren op zijn evenementen. Het zou er zo uit moeten zien:

 pakket view.world import flash.display.MovieClip; import flash.events.Event; import flash.text.TextField; import model.scoreboard.ScoreKeeper; public class ScoreDisplay breidt MovieClip uit private var _scoreKeeper: ScoreKeeper = ScoreKeeper.getInstance (); public function ScoreDisplay () this.score.text = "0"; _scoreKeeper.addEventListener (ScoreKeeper.SCORE_CHANGED, scoreBoard_ScoreChangedHandler, false, 0, true);  persoonlijke functie scoreBoard_ScoreChangedHandler (e: Event): void this.score.text = _scoreKeeper.score.toString (); 

Ga terug naar Flash en open de eigenschappen van het Scorebord-symbool in de bibliotheek. Wijzig de klasse in view.world.ScoreDisplay.

Je hebt nog een laatste stap. Ga terug naar de klasse HeroCharacter en voeg twee regels code toe:

 privéfunctie this_beginContactHandler (e: ContactEvent): void var coin: Coin = e.other.m_userData as Coin; als (munt) coin.remove (); scoreBoard.incrementScore (); 
 openbare klasse HeroCharacter verlengt Box private var contacts: ContactList; privé var scoreKeeper: ScoreKeeper = ScoreKeeper.getInstance ();

Stap 18: voeg statische platforms toe

Ga naar Flash Professsional en plaats een instantie van StaticBox (dezelfde waarmee we muren en de vloer maakten) in de wereldinstantie. Zorg ervoor dat u het type instelt op statisch in de Componentparameters en dat het platform laag genoeg is zodat uw speler er naartoe kan springen.


Stap 19: hangende platforms toevoegen met Box2D-verbindingen

WCK maakt het maken van zwaaiende platforms heel gemakkelijk. We kunnen het hele ding doen in de Flash IDE zonder een code te schrijven.

Begin door een cirkel te tekenen. Converteer de cirkel naar een symbool met de naam gewricht en stel de basisklasse in wck.Joint. Klik vervolgens met de rechtermuisknop op de gewricht symbool in de bibliotheek en ga naar Componentdefinitie. Stel de klasse in als wck.Joint. Stel in het paneel Properties de naam van het exemplaar in anker en in Componentparameters, verander de type naar revolute. Dit is de verbinding die ons platform een ​​slingeractie zal geven.

Teken een platform met het gereedschap Rechthoek. Selecteer het en converteer het naar een symbool. Stel de basisklasse in op extras.Platform. Klik met de rechtermuisknop op het symbool in de bibliotheek en stel in Componentdefinitie de klasse in extras.Platform.

Sleep nog twee instanties van de Joint Class naar World en plaats ze allemaal aan beide uiteinden van het Platform. De lay-out zou er als volgt uit moeten zien:

Voor elk nieuw gezamenlijk exemplaar gaat u naar Componentparameters en wijzigt u type naar 'Afstand' en in de target2Name veld schrijven 'anker'. Test je film en je zou een swingend platform moeten hebben.


Stap 20: Vijanden toevoegen

Voeg in FlashDevelop een nieuwe klasse toe aan de map \ characters \ genaamd EnemyCharacter. Dit is de code die we gaan schrijven (dit zal heel bekend voorkomen):

 package view.characters import Box2DAS.Common.V2; import Box2DAS.Dynamics.ContactEvent; import Box2DAS.Dynamics.StepEvent; import vormen. Box; import wck.ContactList; openbare klasse EnemyCharacter verlengt Box private var contacts: ContactList; private var left: Boolean = true; private var right: Boolean; public override function create (): void fixedRotation = true; reportBeginContact = true; super.create (); contacten = nieuwe ContactList (); contacts.listenTo (deze); listenWhileVisible (world, StepEvent.STEP, world_stepEventHandler, false, 0, true); listenWhileVisible (this, ContactEvent.BEGIN_CONTACT, this_beginContactHandler, false, 0, true);  private function world_stepEventHandler (e: StepEvent): void if (left) b2body.ApplyImpulse (new V2 (-. 1, 0), b2body.GetWorldCenter ());  else if (right) b2body.ApplyImpulse (nieuwe V2 (.1, 0), b2body.GetWorldCenter ());  persoonlijke functie this_beginContactHandler (e: ContactEvent): void var wall: StaticBox = e.other.m_userData als StaticBox; if (wall) left =! left; rechts =! rechts; 

Het enige nieuwe is dat elke keer dat het object tegen een muur botst, het van richting verandert. En bij elke stapsituatie zal het vijandige karakter een impuls krijgen in de richting waarin hij staat.

Ga terug naar Flash en teken een vijandig personage en converteer het naar een symbool met de Base Class ingesteld op view.characters.EnemyCharacter en Class ingesteld op Vijand.

Het laatste dat we moeten doen, is contact maken tussen het personage van de speler en het personage van de vijand. In de HeroCharacter klasse, voeg de volgende code toe:

 privéfunctie this_beginContactHandler (e: ContactEvent): void var coin: Coin = e.other.m_userData as Coin; trace (coin); als (munt) coin.remove (); scoreKeeper.incrementScore ();  else var enemy: EnemyCharacter = e.other.m_userData as EnemyCharacter; if (vijand) var tempManifold: b2WorldManifold = e.getWorldManifold (); if (tempManifold.normal.y> 0) Util.addChildAtPosOf (world, new BadGuyFX (), enemy); enemy.remove (); 

Als onze held contact maakt met iets en het geen munt is, zullen we controleren of het de munt is EnemyCharacter. Als dat zo is, controleren we de variëteit van de ContactEvent om te bepalen of we de slechterik bovenaan of aan de zijkant raken. Als we boven op hem gesprongen zijn, wordt hij van het podium verwijderd.

Ik wilde een animatie toevoegen van het vijandelijke personage dat zo platgedrukt werd in Flash. Ik maakte een filmclip met een tijdbalkanimatie waarin de vijand verpletterd werd. Ik heb de basisklasse daarvan ingesteld BadGuyFX bezwaar tegen misc.FX, een klasse in de WCK-bibliotheek die één keer door zijn eigen tijdlijnanimatie speelt en zichzelf vervolgens instelt nul. Toen heb ik het met de. Aan het podium toegevoegd util methode addChildAtPosOf (). De animatie zorgt ervoor dat het verwijderen van de vijand niet zo plotseling lijkt.


Conclusie

Nu je een werkend prototype van een platformgame hebt, moedig ik je aan om te blijven onderzoeken wat WCK te bieden heeft. Ik raad vooral aan om in de Component-parameters van je game-objecten te spelen. Dit is echt een leuke en snelle manier om de fysica van je spelwereld te veranderen zonder een code te schrijven. Ik hoop dat je deze tutorial leuk vond! Bedankt voor het lezen!