Costruisci un platform basato sulla fisica in meno di un'ora

In questo tutorial imparerai a creare un gioco platform basato sulla fisica nel modo più veloce possibile con World Construction Kit.


Anteprima del risultato finale

Diamo un'occhiata al risultato finale su cui lavoreremo:

È un po 'traballante, ma può essere aggiustato - e aspetta di vedere quanto è stato facile e veloce da fare!


Passaggio 1: download

Scarica le librerie Box2D Alchemy Port e WCK. Ottieni la fonte da github e per ulteriori informazioni, vedi www.sideroller.com.


Passaggio 2: nuovo progetto FlashDevelop

Fare clic su "Progetto" e selezionare "Nuovo progetto" dall'elenco. Selezionare Progetto AS3 come modello di progetto, assegna un nome al progetto, posizionalo in una directory vuota e fai clic su OK.

Individua le librerie Box2D / WCK scaricate nel passaggio 1 e posiziona le seguenti cartelle nella cartella "lib" del nuovo progetto: Box2D, Box2DAS, extra, gravità, misc, forme, e WCK.

Fare nuovamente clic su 'Progetto' e selezionare Proprietà. Fare clic sulla scheda 'Classpaths' e aggiungere la cartella lib.

Apri Main.as nel file sorgente e aggiungi il codice evidenziato. FlashDevelop dovrebbe avere generato automaticamente il resto.

 public class Main extends WCK public function Main (): void if (stage) init (); else addEventListener (Event.ADDED_TO_STAGE, init);  funzione privata init (e: Event = null): void removeEventListener (Event.ADDED_TO_STAGE, init); // punto d'entrata  

Passaggio 3: configura l'IDE Flash

Apri Flash Professional. Premi Ctrl + Maiusc + F12 per aprire Impostazioni di pubblicazione. Fare clic sulla scheda Flash. Seleziona l'opzione 'Esporta SWC'

? e quindi fare clic su impostazioni pulsante accanto al ActionScript 3.0 casella combinata.

Nella scheda Percorso sorgente, fai clic sull'icona 'sfoglia a percorso' e seleziona il tuo lib cartella. Quindi fare clic sulla scheda Percorso libreria e selezionare l'icona 'sfoglia a SWC'. Seleziona il file lib / Box2DAS / Box2D.swc.

Fare clic su OK in Impostazioni avanzate Actionscript 3 e nuovamente nella finestra Impostazioni pubblicazione. Salva il tuo FLA nella cartella \ src \ del tuo progetto FlashDevelop (la stessa cartella con Main.as).

Infine, premi Ctrl + F3 per aprire le proprietà del documento e imposta la Document Class su Main.


Passaggio 4: il tuo primo oggetto mondiale

Inizia usando lo strumento rettangolo per disegnare un rettangolo sul palco.

Converti il ​​rettangolo in un simbolo selezionandolo e premendo F8.

Imposta il punto di registrazione al centro. * Nota: è molto importante registrare in questo modo tutti i simboli del gioco. In caso contrario, ciò influirà sul modo in cui l'oggetto risponde alla gravità e alle collisioni.

Fare clic su "esporta per Actionscript" e impostare la classe base su shapes.Box


Passaggio 5: Crea il mondo

Questo può sembrare contro-intuitivo, che hai fatto un oggetto del mondo prima di aver creato il tuo mondo. Potresti farlo in entrambi i modi, ma vedrai che è più veloce farlo in questo modo.

Seleziona il tuo oggetto Scatola statica sullo stage e premi F8.

Proprio come hai fatto con la casella statica, imposta il punto di registrazione del mondo al centro e controlla Esporta per ActionScript.

Imposta la classe base su wck.World


Passaggio 6: definizione del componente del mondo

Fai clic con il pulsante destro del mouse sul simbolo del mondo appena creato nella libreria.

Seleziona "Definizione componente?"

Nel campo Classe, digitare wck.World

Questo è un importante punto di vendita per il World Construction Kit. Se ora fai clic sull'oggetto Mondo sullo stage e apri il pannello delle proprietà premendo Ctrl + F3, puoi modificare un gruppo delle proprietà ispezionabili del componente Mondo sotto l'intestazione 'Parametri componente'.


Passaggio 7: definire il componente oggetto statico

Ok, ora faremo la stessa cosa con il nostro oggetto statico.

Fai clic con il tasto destro del mouse sul simbolo della casella statica nella libreria.

Seleziona "Definizione componente?"

Nel campo Classe, digitare wck.BodyShape

Aprire il pannello delle proprietà selezionando l'oggetto Scatola statica sullo stage e premendo Ctrl + F3.

Scorri verso il basso la finestra Parametri componente e modifica il "tipo" da dinamico a statico. Se ti dimentichi di farlo, i componenti statici (muri, pavimenti, piattaforme) diventeranno soggetti alla gravità e cadranno dallo schermo in fase di runtime.


Passaggio 8: Costruisci il pavimento e i muri

Seleziona il tuo oggetto statico all'interno del mondo. Copia e incolla un paio di volte.

Seleziona ogni istanza di Oggetto statico e, usando "Trasformazione libera", allunga, inclina e sposta gli oggetti statici attorno per formare muri e un pavimento. Non è necessario mantenere i limiti sul palco.

Ecco un esempio di uno dei miei tentativi:

Chiaramente, "essere un artista" non è un prerequisito per questo tutorial?


Step 9: Costruisci il tuo eroe!

Cos'è un buon platform senza un protagonista irresistibile?

Mentre sei all'interno dell'oggetto Mondo, disegna un rettangolo. Sentiti libero di essere creativo qui. Questo è il meglio che sono stato in grado di fare:

Converti il ​​tuo personaggio in un simbolo, ma non dichiarare ancora una Base Class.

Fai clic con il tasto destro del mouse sul nuovo simbolo di Hero nella libreria.

Seleziona "Definizione componente?"

Nel campo Classe, digitare wck.BodyShape


Passaggio 10: creare la classe del lettore

Apri FlashDevelop.

Assicurati che il tuo progetto sia aperto. Nel \ Src \ cartella, crea una nuova cartella chiamata 'Visualizza'. In "Visualizza" crea una nuova cartella denominata "Caratteri".

Fare clic con il tasto destro del mouse su "Visualizza" e Aggiungi nuova classe.

Dai un nome alla tua classe qualcosa del genere HeroCharacter.as e impostare la classe base su shapes.Box.

La struttura della cartella dovrebbe ora apparire così:


Passaggio 11: Sostituisci il metodo di creazione

Questo è il punto di ingresso per aggiungere funzionalità ai tuoi personaggi.

Aggiungi il seguente codice alla nostra nuova classe:

 La classe pubblica HeroCharacter estende Box private var contacts: ContactList; public override function create (): void reportBeginContact = true; reportEndContact = true; contacts = new ContactList (); contacts.listenTo (questo); fixedRotation = true; listenWhileVisible (world, StepEvent.STEP, world_stepEventHandler, false, 0, true); listenWhileVisible (this, ContactEvent.BEGIN_CONTACT, this_beginContactHandler, false, 0, true); super.create (); 

IMPOSTANDO reportBeginContact e reportEndContact a vero, stiamo impostando le proprietà su La forma del corpo classe. Stiamo indicando che vorremmo il La forma del corpo spedire ContactEvents quando iniziano le collisioni e quando terminano le collisioni. Quindi istanziamo a Lista dei contatti e chiedilo a "ascoltare Questo". ContactList.listenTo (questo) crea ascoltatori per ContactEvent.BEGIN_CONTACT e ContactEvent.END_CONTACT. Quindi crea gestori per ciascuno che memorizza le informazioni di collisione. Puoi vedere tutto ciò mettendo il cursore sopra Lista dei contatti e premendo Ctrl + F4 in FlashDevelop.

IMPOSTANDO fixedRotation a vero, ci assicuriamo che il nostro eroe non ruoti in avanti o all'indietro quando si scontrano con oggetti.

listenWhileVisible è un altro modo per aggiungere ascoltatori di eventi. Avremmo potuto usarlo addEventListener (StepEvent.STEP, parseInput, false, 0, true); ma la funzionalità aggiunta qui è quella listenWhileVisible rimuoverà i listener di eventi e li designerà per la garbage collection quando il file Entità è stato rimosso dal gioco. Per i nostri scopi, listenWhileVisible è una versione più ottimizzata di addEventListener. * Nota: come con addEventListener, utilizzare sempre riferimenti deboli in modo che gli oggetti non utilizzati siano idonei per la garbage collection.

Usando super.create () noi chiamiamo il creare() metodo attivo La forma del corpo. Questo ci consente di estendere la funzionalità di creare() metodo invece di sostituirlo.


Passaggio 12: Gestire l'ingresso del lettore

Iniziamo creando il nostro StepEvent gestore per l'input del giocatore.

 funzione privata world_stepEventHandler (e: StepEvent): void 

Ad ogni intervallo di tempo, a StepEvent sarà spedito dal b2World classe in Box2D. Il passo temporale predefinito è 0,05 secondi. Puoi cambiare il timestep parametro facilmente tornando a Flash Professional e aprendo i parametri del componente World.

Successivamente, useremo l'utility Input per determinare quali tasti vengono attualmente premuti dall'utente.

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

Il metodo Input.kd può accettare più argomenti. Quindi, se volessimo consentire all'utente di essere in grado di controllare HeroCharacter con WASD e la barra spaziatrice, potremmo modificare il codice come segue:

 funzione privata 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 () ascolta quando un tasto è premuto, mentre Input.kp () ascolta per un istante la pressione di un tasto.


Passaggio 13: applicare Impulso per spostare il lettore

Quando l'impulso viene applicato a un corpo rigido, la quantità di moto del corpo viene cambiata. Lo slancio è il prodotto di massa e velocità. Quindi, quando vogliamo cambiare la velocità (velocità e direzione) del nostro giocatore, useremo un metodo b2body chiamato ApplyImpulse ().

 funzione privata 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 (nuovo V2 (0, -2), b2body.GetWorldCenter ()); else if (left ) b2body.ApplyImpulse (nuovo V2 (-2, 0), b2body.GetWorldCenter ()); else if (right) b2body.ApplyImpulse (nuovo V2 (2, 0), b2body.GetWorldCenter ());

ApplyImpulse () accetta due parametri: il vettore dell'impulso mondiale e il punto di applicazione dell'impulso. Per ora, passeremo un nuovo vettore 2D come primo parametro per il salto, spostandoci a sinistra e a destra (dovremo fare una regolazione su come gestiamo il salto un po 'più avanti). Il secondo parametro per ciascuno ApplyImpulse il metodo è b2body.GetWorldCenter (). Questo metodo restituisce la posizione mondiale della massa centrale del nostro eroe. Questo è importante perché ApplyImpulse cambierà la velocità angolare del nostro eroe se non agisce sulla sua massa centrale (questo è anche il motivo per cui abbiamo usato la registrazione centrale sull'eroe in Flash).


Step 14: Gestisci la Forza Normale

Torna in Flash Professional e imposta la classe del simbolo Eroe su "view.characters.HeroCharacter" e lascia vuota la classe base. Successivamente, imposta il nome dell'istanza dell'istanza Hero su "hero".

Nei parametri dei componenti del componente Mondo, deseleziona 'allowDragging' e seleziona 'scrolling'. In questo modo, l'utente non sarà in grado di trascinare il tuo personaggio con il mouse e la telecamera seguirà il tuo giocatore quando si muoverà. Infine, nel campo "focusOn", digita "eroe", il nome dell'istanza del tuo eroe.

Premi Ctrl + Invio per testare il film. Noterai che puoi muovere il tuo personaggio premendo a sinistra e a destra e puoi saltare con lo spazio. Ma se continui a premere spazio, continuerai a saltare indefinitamente.

Il motivo per cui non possiamo continuare a saltare indefinitamente è che una volta che siamo in volo, non c'è niente per i nostri piedi che spingano per spingere su di noi. Non c'è forza uguale ai nostri piedi che respingono. Quando siamo piantati saldamente a terra, la forza che ci aiuta a saltare verso l'alto e ci impedisce di cadere attraverso il pavimento è chiamata forza normale. Quello che dobbiamo fare è determinare quale sia la forza normale sui nostri giocatori. Se non c'è una forza normale, allora non può fare un salto. Lo faremo facendo uso della nostra ContactList.

Torna in FlashDevelop. Modifichiamo ancora una volta il nostro gestore eventi passo:

 funzione privata 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 (left) b2body.ApplyImpulse (nuovo V2 (-. 5, 0), b2body.GetWorldCenter ()); else if (right) b2body.ApplyImpulse (nuovo V2 (.5, 0), b2body.GetWorldCenter ());

Scriveremo il codice per il getNormalForce () metodo in un secondo. Quello che vogliamo fare qui è cercare contatti (il nostro giocatore sta toccando qualcosa?) Ottenere una varietà che descrive dove il nostro giocatore sta toccando un contatto (sul lato o sul fondo) e accelera il giocatore verso l'alto se sta prendendo contatto con il terreno. Se non ci sono contatti, il nostro eroe deve essere a mezz'aria. In tal caso, il collettore sarebbe nullo e il giocatore non sarebbe in grado di saltare.

Ora scriviamo il getNormalForce () metodo.

 funzione privata getNormalForce (): b2WorldManifold var collold: 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); varietà = tempManifold;); contacts.clean (); ritorno collettore; 

Prima di chiamare getNormalForce (), controlliamo se il nostro giocatore è in contatto con qualcosa. Se non lo è, allora sappiamo che è in volo. L'intera ragione per cui esiste questa funzione è di impedire al giocatore di fare un secondo salto da un muro o dal lato di una piattaforma.

Per prima cosa dichiariamo una variabile locale chiamata molteplice e impostarlo nullo. Questo è il parametro che ritorneremo. Se il personaggio dell'eroe è in contatto con qualcosa alla sua destra sinistra o in alto (ma non a terra) questa funzione restituirà una varietà nulla.

Utilizzando il metodo contacts.forEach (), possiamo controllare ogni ContactEvent nella nostra ContactList. Tutti i ContactEvents hanno una proprietà worldManifold. Quindi creiamo un'altra variabile locale chiamata tempManifold e la impostiamo sul valore restituito da ogni contactEvent.GetWorldManifold. Successivamente, controlliamo se temp.normal.y è maggiore di zero. Qui stiamo chiedendo, c'è la forza normale dell'asse y?

Se l'eroe è a terra o su una piattaforma, azzeriamo qualsiasi forza normale dell'asse x. In caso contrario, il buggy jumping viene eseguito quando il giocatore viene spinto contro un muro. Sentiti libero di sperimentare questo. Se non azzeri la x, il giocatore ottiene un tipo interessante (ancora inaffidabile) di abilità di salto sul muro di Metroid.

Finalmente, pulisci la ContactList. Non vogliamo gestire gli stessi contatti più di una volta.


Step 15: Aggiungi monete

Ora che abbiamo un protagonista che può correre e saltare, aggiungiamo alcuni elementi che può raccogliere. Torna in Flash Professional, disegna un cerchio o un'ellisse per una moneta e convertilo in un simbolo. Imposta la classe e la classe base come mostrato:

Metti tutte le istanze della classe Coin che vuoi sullo stage. In Parametri componente, imposto il tipo di ogni moneta a statico in modo che non siano influenzati dalla gravità e possano galleggiare come in Mario, ma dipende da te.


Step 16: Gestisci le collisioni con le monete

In questo momento, le monete sono oggetti immobili e statici. Ci piacerebbe cambiarlo. Torna a FlashDevelop e apri il HeroCharacter classe. Aggiungi un gestore di eventi per collisioni come questa:

 funzione privata this_beginContactHandler (e: ContactEvent): void 

Questo è il gestore per l'ascoltatore che abbiamo creato nel passaggio 11. Aggiungere il seguente codice:

 funzione privata this_beginContactHandler (e: ContactEvent): void var coin: Coin = e.other.m_userData as Coin; if (coin) coin.remove (); 

Per prima cosa creiamo una var locale chiamata moneta è lo stesso tipo della Coin Coin che hai creato in Flash. ContactEvent tiene traccia dell'altro dispositivo Box2D coinvolto nella collisione. Se è Coin, lo rimuoviamo dallo Stage, dando l'illusione che sia stato raccolto.


Passaggio 17: Mantieni il punteggio

Crea una cartella all'interno della directory \ src \ chiamata 'modello'. All'interno del 'modello' crea una cartella chiamata 'tabellone' e fai una nuova classe chiamata ScoreBoard quello si estende EventDispatcher. Dal momento che desideriamo avere una sola istanza del tabellone segnapunti in una sola volta, seguiremo il modello di progettazione di Singleton. C'è stato un breve suggerimento sul pattern Singleton su Activetuts + all'inizio di quest'anno se si desidera un riferimento.

Scrivi il seguente codice nella classe ScoreBoard:

 package model.scoreboard import flash.errors.IllegalOperationError; import flash.events.Event; import flash.events.EventDispatcher; public class ScoreKeeper estende EventDispatcher private static var _instance: ScoreKeeper; public function ScoreKeeper () if (_instance! = null) throw new IllegalOperationError ("Use ScoreBoard.getInstance () per ottenere un riferimento a Singleton ScoreKeeper.");  else initialize ();  funzione privata initialize (): void  public static function getInstance (): ScoreKeeper if (_instance == null) _instance = new ScoreKeeper (); return _instance; 

Questo è il modello di Singleton. Ci aspettiamo che ogni Classe voglia accedere a ScoreKeeper per utilizzare la funzione statica getInstance (). Se un'istanza esiste già e qualcuno (un altro sviluppatore del tuo team, ad esempio) tenta di creare un'istanza di ScoreKeeper tramite il suo costruttore, riceverà il nostro messaggio di errore indicando che è possibile accedere a ScoreKeeper solo tramite getInstance ().

ScoreKeeper estende EventDispatcher in modo che possa inviare eventi quando il punteggio cambia. Costruiremo un tabellone come componente di vista che si iscriverà agli eventi ScoreKeeper.

Ora abbiamo bisogno di ScoreKeeper per iniziare effettivamente a tenere il punteggio. Abbiamo bisogno di una variabile per contenere il punteggio, un metodo che incrementa il punteggio, un getter per il punteggio in modo che altre classi possano accedervi e un statico pubblico const per memorizzare il nostro tipo di evento.

package model.scoreboard import flash.errors.IllegalOperationError; import flash.events.Event; import flash.events.EventDispatcher; public class ScoreKeeper estende EventDispatcher const statico pubblico SCORE_CHANGED: String = "SCORE_CHANGED"; private var _score: uint; private static var _instance: ScoreKeeper; public function ScoreKeeper () if (_instance! = null) throw new IllegalOperationError ("Use ScoreBoard.getInstance () per ottenere un riferimento a Singleton ScoreKeeper."); else initialize (); private function initialize (): void _score = 0; public function incrementScore (): void _score ++; dispatchEvent (new Event ("SCORE_CHANGED")); public static function getInstance (): ScoreKeeper if (_instance == null) _instance = new ScoreKeeper (); return _instance; public function get score (): uint return _score;

E questo è tutto ciò di cui abbiamo bisogno per il nostro ScoreKeeper. Ora facciamo un componente di visualizzazione per visualizzare il numero del punteggio. Entra in Flash e sul palco (non all'interno del simbolo del Mondo) disegna un tabellone. L'unica cosa importante qui è che usi lo strumento Testo per disegnare un campo di testo con il nome dell'istanza 'Punto'. Converti il ​​TextField in un simbolo di clip filmato chiamato ScoreBoard.

Di nuovo in FlashDevelop, nella cartella del mondo, crea una classe chiamata 'ScoreDisplay' che estende MovieClip. Tutto ciò che dobbiamo fare qui è ottenere un'istanza di ScoreKeeper e iscriversi ai suoi eventi. Dovrebbe sembrare come questo:

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

Torna a Flash e apri le proprietà del simbolo ScoreBoard nella libreria. Cambia la classe in view.world.ScoreDisplay.

Hai un ultimo passaggio. Torna alla classe HeroCharacter e aggiungi due righe di codice:

 funzione privata this_beginContactHandler (e: ContactEvent): void var coin: Coin = e.other.m_userData as Coin; if (coin) coin.remove (); scoreBoard.incrementScore (); 
 La classe pubblica HeroCharacter estende Box private var contacts: ContactList; private var scoreKeeper: ScoreKeeper = ScoreKeeper.getInstance ();

Passaggio 18: aggiungere piattaforme statiche

Entra in Flash Professsional e posiziona un'istanza di StaticBox (lo stesso che usavamo per fare i muri e il pavimento) all'interno dell'istanza World. Assicurati di aver impostato il suo tipo su statico nei Parametri dei componenti e che la piattaforma è abbastanza bassa da consentire al giocatore di saltare ad essa.


Passaggio 19: aggiungere piattaforme sospese con i giunti Box2D

WCK rende la creazione di piattaforme oscillanti molto semplice. Possiamo fare tutto in Flash IDE senza scrivere alcun codice.

Inizia disegnando un cerchio. Converti il ​​cerchio in un simbolo chiamato comune e impostare la classe base su wck.Joint. Quindi, fare clic con il tasto destro del mouse su comune simbolo nella libreria e vai a Definizione del componente. Imposta la classe come wck.Joint. Nel pannello Proprietà, impostare il nome dell'istanza come ancora e in Parametri componente, cambia il genere a revolute. Questa è l'articolazione che darà alla nostra piattaforma un'azione a pendolo.

Disegna una piattaforma con lo strumento Rettangolo. Selezionalo e convertilo in un simbolo. Impostare la classe base su extras.Platform. Fare clic con il tasto destro sul simbolo nella libreria e in Definizione componente, impostare la Classe su extras.Platform.

Trascina altre due istanze della Joint Class in World e posizionane ciascuna su entrambe le estremità della piattaforma. Il layout dovrebbe assomigliare a questo:

Per ogni nuova istanza Joint, vai in Parametri componenti e cambia genere a 'Distanza'e nel target2Name campo scrivi 'ancora'. Metti alla prova il tuo film e dovresti avere una piattaforma oscillante.


Passaggio 20: Aggiungi nemici

In FlashDevelop, aggiungi una nuova classe alla cartella \ characters \ chiamata EnemyCharacter. Ecco il codice che scriveremo (sembrerà molto familiare):

 package view.characters import Box2DAS.Common.V2; import Box2DAS.Dynamics.ContactEvent; import Box2DAS.Dynamics.StepEvent; importa shapes.Box; import wck.ContactList; EnemyCharacter di classe pubblica estende Box private var contacts: ContactList; private var left: Boolean = true; private var right: Boolean; funzione di override pubblica create (): void fixedRotation = true; reportBeginContact = true; super.create (); contacts = new ContactList (); contacts.listenTo (questo); listenWhileVisible (world, StepEvent.STEP, world_stepEventHandler, false, 0, true); listenWhileVisible (this, ContactEvent.BEGIN_CONTACT, this_beginContactHandler, false, 0, true);  funzione privata world_stepEventHandler (e: StepEvent): void if (left) b2body.ApplyImpulse (nuovo V2 (-. 1, 0), b2body.GetWorldCenter ());  else if (right) b2body.ApplyImpulse (new V2 (.1, 0), b2body.GetWorldCenter ());  funzione privata this_beginContactHandler (e: ContactEvent): void var wall: StaticBox = e.other.m_userData come StaticBox; if (wall) left =! left; destra =! destra; 

L'unica cosa nuova qui è che ogni volta che l'oggetto si scontra con un muro, cambia direzione. E ogni evento del passo, il personaggio nemico sta per avere un impulso applicato nella direzione che sta affrontando.

Torna in Flash e disegna un personaggio nemico e convertilo in un simbolo con la Base Class impostata su view.characters.EnemyCharacter e la classe è impostata su Nemico.

L'ultima cosa che dobbiamo fare è gestire il contatto tra il personaggio del giocatore e il personaggio nemico. Nel HeroCharacter classe, aggiungi il seguente codice:

 funzione privata this_beginContactHandler (e: ContactEvent): void var coin: Coin = e.other.m_userData as Coin; trace (moneta); if (coin) coin.remove (); scoreKeeper.incrementScore ();  else var enemy: EnemyCharacter = e.other.m_userData come EnemyCharacter; if (enemy) var tempManifold: b2WorldManifold = e.getWorldManifold (); if (tempManifold.normal.y> 0) Util.addChildAtPosOf (mondo, nuovo BadGuyFX (), nemico); enemy.remove (); 

Se il nostro eroe entra in contatto con qualcosa e non è una moneta, controlleremo per vedere se è il EnemyCharacter. Se lo è, controlleremo il molteplice di ContactEvent per determinare se colpiamo il cattivo in cima o sul lato. Se gli saltassimo addosso, verrà rimosso dal palco.

Volevo aggiungere un'animazione del EnemyCharacter che si schiacciava, quindi in Flash ho creato un filmato con un'animazione della timeline del nemico che si stava schiantando. Ho impostato la Base Class di questo BadGuyFX oggetto a misc.FX, una classe nella libreria WCK che riproduce la propria animazione della timeline una volta e quindi si imposta su nullo. Poi l'ho aggiunto allo stage con il util metodo addChildAtPosOf (). L'animazione rende la rimozione del nemico non sembra così improvvisa.


Conclusione

Ora che hai un prototipo funzionante di un platform, ti incoraggio a continuare ad esplorare ciò che WCK ha da offrire. Consiglio soprattutto di giocare nei Parametri componente degli oggetti del gioco. Questo è un modo davvero divertente e veloce per alterare la fisica del tuo mondo di gioco senza scrivere alcun codice. Spero che questo tutorial ti sia piaciuto! Grazie per aver letto!