Construire un jeu de plateforme basé sur la physique en moins d'une heure

Dans ce didacticiel, vous allez apprendre à créer un jeu de plate-forme basé sur la physique de la manière la plus rapide possible avec le World Construction Kit..


Aperçu du résultat final

Jetons un coup d'œil au résultat final sur lequel nous allons travailler:

C’est un peu insignifiant, mais cela peut être corrigé - et attendez de voir à quel point il était facile et rapide de le faire.!


Étape 1: Télécharger

Téléchargez les bibliothèques Box2D Alchemy Port et WCK. Obtenez le code source de github et pour plus d’informations, visitez www.sideroller.com.


Étape 2: Nouveau projet FlashDevelop

Cliquez sur 'Projet' et sélectionnez 'Nouveau projet' dans la liste. Sélectionner Projet AS3 comme modèle de projet, nommez votre projet, pointez-le dans un répertoire vide et cliquez sur OK..

Localisez les bibliothèques Box2D / WCK que vous avez téléchargées à l'étape 1 et placez les dossiers suivants dans le dossier 'lib' de votre nouveau projet: Box2D, Box2DAS, les extras, la gravité, divers, formes, et wck.

Cliquez à nouveau sur 'Projet' et sélectionnez Propriétés. Cliquez sur l'onglet 'Classpaths' et ajoutez votre dossier lib.

Ouvrez Main.as dans le fichier source et ajoutez le code en surbrillance. FlashDevelop aurait dû générer automatiquement le reste.

 classe publique Main étend WCK fonction publique Main (): void if (stage) init (); sinon addEventListener (Event.ADDED_TO_STAGE, init);  fonction privée init (e: Event = null): void removeEventListener (Event.ADDED_TO_STAGE, init); // point d'accès  

Étape 3: Configuration de l'IDE Flash

Ouvrez Flash Professional. Appuyez sur Ctrl + Maj + F12 pour ouvrir les paramètres de publication. Cliquez sur l'onglet Flash. Sélectionnez l'option 'Export SWC'

? puis cliquez sur le Réglages bouton à côté du ActionScript 3.0 boîte combo.

Dans l’onglet Chemin source, cliquez sur l’icône 'parcourir jusqu’au chemin' et sélectionnez votre lib dossier. Cliquez ensuite sur l'onglet Chemin de la bibliothèque et sélectionnez l'icône 'naviguer vers SWC'. Sélectionnez le fichier lib / Box2DAS / Box2D.swc.

Cliquez sur OK dans Paramètres avancés Actionscript 3, puis à nouveau dans la fenêtre Paramètres de publication. Enregistrez votre fichier FLA dans le dossier \ src \ de votre projet FlashDevelop (le même dossier que Main.as)..

Enfin, appuyez sur Ctrl + F3 pour ouvrir les propriétés du document et définir la classe de document sur Main..


Étape 4: Votre premier objet mondial

Commencez par utiliser l'outil Rectangle pour dessiner un rectangle sur la scène.

Convertissez le rectangle en symbole en le sélectionnant et en appuyant sur F8.

Définissez le point d’enregistrement au centre. * Remarque: Il est très important que vous enregistriez tous les symboles de jeu de cette façon. Si vous ne le faites pas, cela affectera la réponse de votre objet à la gravité et aux collisions..

Cliquez sur 'exporter pour Actionscript' et définissez la classe de base sur formes.Box


Étape 5: Créer le monde

Cela peut sembler contre-intuitif, que vous ayez fait un objet du monde avant de créer votre monde. Vous pouvez le faire de toute façon, mais vous verrez que c'est plus rapide de le faire de cette façon..

Sélectionnez votre objet Static Box sur la scène et appuyez sur F8..

Comme vous l'avez fait avec la Static Box, définissez le point d'enregistrement du monde sur le centre et vérifiez Exporter pour ActionScript.

Définissez la classe de base sur wck.World


Étape 6: Définir la composante mondiale

Faites un clic droit sur votre nouveau symbole mondial dans la bibliothèque.

Sélectionnez "Définition du composant?"

Dans le champ Classe, tapez wck.World

Il s’agit d’un argument de vente majeur pour le World Construction Kit. Si vous cliquez maintenant sur l'objet World sur la scène et ouvrez le panneau de propriétés en appuyant sur Ctrl + F3, vous pouvez éditer un ensemble de propriétés inspectables du composant World sous l'en-tête "Paramètres du composant"..


Étape 7: Définir le composant d'objet statique

Ok, maintenant nous allons faire la même chose avec notre objet statique.

Faites un clic droit sur le symbole de votre boîte statique dans la bibliothèque.

Sélectionnez "Définition du composant?"

Dans le champ Classe, tapez wck.BodyShape

Ouvrez le panneau de propriétés en sélectionnant l'objet Boîte statique sur la scène et en appuyant sur Ctrl + F3..

Faites défiler la fenêtre Paramètre de composant vers le bas et modifiez le "type" de dynamique à statique. Si vous oubliez de le faire, vos composants statiques (murs, sols, plates-formes) seront soumis à la gravité et tomberont de l'écran au moment de l'exécution..


Étape 8: Construire le sol et les murs

Sélectionnez votre objet statique à l'intérieur du monde. Copiez et collez-le plusieurs fois.

Sélectionnez chaque instance d'objet statique et, à l'aide de 'Transformation libre', étirez, inclinez et déplacez vos objets statiques pour former des murs et un sol. Vous n'avez pas besoin de garder les limites sur la scène.

Voici un exemple d'une de mes tentatives:

De toute évidence, "être un artiste" n'est pas une condition préalable à ce tutoriel.?


Étape 9: Construisez votre héros!

Qu'est-ce qu'un bon jeu de plateforme sans un protagoniste convaincant??

À l'intérieur de l'objet World, dessinez un rectangle. N'hésitez pas à faire preuve de créativité ici. C'est le mieux que j'ai pu faire:

Convertissez votre personnage en symbole, mais ne déclarez pas encore une classe de base.

Faites un clic droit sur votre nouveau symbole Hero dans la bibliothèque.

Sélectionnez "Définition du composant?"

Dans le champ Classe, tapez wck.BodyShape


Étape 10: Créer la classe de joueur

Ouvrir FlashDevelop.

Assurez-vous que votre projet est ouvert. dans le \ src \ dossier, créez un nouveau dossier appelé "View". Dans "Affichage", créez un nouveau dossier appelé "Caractères".

Faites un clic droit 'View' et ajoutez une nouvelle classe.

Nommez votre classe quelque chose comme HeroCharacter.as et définissez la classe de base sur formes.Box.

Votre structure de dossier devrait maintenant ressembler à ceci:


Étape 11: Remplacez la méthode Create

C'est le point d'entrée pour ajouter des fonctionnalités à vos personnages..

Ajoutez le code suivant à notre nouvelle classe:

 Classe publique HeroCharacter. Etend Box private var contacts: ContactList; fonction de substitution publique create (): void reportBeginContact = true; reportEndContact = true; contacts = new ContactList (); contacts.listenTo (this); fixedRotation = true; listenWhileVisible (world, StepEvent.STEP, world_stepEventHandler, false, 0, true); listenWhileVisible (this, ContactEvent.BEGIN_CONTACT, this_beginContactHandler, false, 0, true); super.create (); 

En mettant reportBeginContact et reportEndContact à vrai, nous définissons des propriétés sur le Forme du corps classe. Nous indiquons que nous aimerions que le Forme du corps déployer ContactÉvénements quand les collisions commencent et quand les collisions se terminent. Nous instancions alors un Liste de contacts et lui demander de "Ecouter ce". ContactList.listenTo (this) crée des auditeurs pour ContactEvent.BEGIN_CONTACT et ContactEvent.END_CONTACT. Il crée ensuite des gestionnaires pour chacun qui stocke les informations de collision. Vous pouvez voir tout cela en plaçant votre curseur sur Liste de contacts et en appuyant sur Ctrl + F4 dans FlashDevelop.

En mettant fixedRotation à vrai, nous nous assurons que notre héros ne tournera pas en avant ou en arrière lors d'une collision avec des objets.

écoutezVisible est une autre façon d’ajouter des écouteurs d’événements. Nous aurions pu utiliser addEventListener (StepEvent.STEP, parseInput, false, 0, true); mais la fonctionnalité ajoutée est que écoutezVisible va supprimer les écouteurs de l'événement et les désigner pour la collecte des ordures lorsque le Entité a été retiré du jeu. Pour nos besoins, écoutezVisible est une version plus optimisée de addEventListener. * Note: comme avec addEventListener, utilisez toujours des références faibles afin que les objets inutilisés soient éligibles pour la récupération de place.

En utilisant super.create () nous appelons le créer() méthode sur Forme du corps. Cela nous permet d’étendre les fonctionnalités du créer() méthode au lieu de le remplacer.


Étape 12: Gérer la saisie du lecteur

Commençons par créer notre StepEvent gestionnaire pour l'entrée du joueur.

 fonction privée world_stepEventHandler (e: StepEvent): void 

A chaque intervalle de temps, un StepEvent sera envoyé à partir du b2World classe dans Box2D. Le pas de temps par défaut est 0,05 seconde. Vous pouvez changer le timeStep paramètre facilement en revenant à Flash Professional et en ouvrant les paramètres du composant World.

Ensuite, nous utiliserons l’utilitaire de saisie pour déterminer les touches sur lesquelles l'utilisateur appuie.

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

La méthode Input.kd peut accepter plusieurs arguments. Donc, si nous voulions permettre à l'utilisateur de pouvoir contrôler HeroCharacter avec WASD et la barre d'espace, nous pourrions modifier le code comme suit:

 fonction privée world_stepEventHandler (e: StepEvent): void var à gauche: Boolean = Input.kd ('LEFT', 'A'); var right: Boolean = Input.kd ('RIGHT', 'D'); var jump: Boolean = Input.kp ('UP', ", 'W');

Input.kd () écoute quand une touche est enfoncée, tandis que Input.kp () écoute l'instant où une touche est enfoncée.


Étape 13: appliquer une impulsion pour déplacer le lecteur

Lorsque l'impulsion est appliquée à un corps rigide, l'élan du corps est modifié. L'élan est le produit de la masse et de la vitesse. Alors, quand on veut changer la vitesse (vitesse et direction) de notre joueur, on utilisera une méthode sur b2body appelé ApplyImpulse ().

 fonction privée 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 (nouvelle version V2 (0, -2), b2body.GetWorldCenter ()); else if (à gauche ) b2body.ApplyImpulse (nouvelle version 2 (-2, 0), b2body.GetWorldCenter ()); sinon, si (à droite) b2body.ApplyImpulse (nouvelle version V2 (2, 0), b2body.GetWorldCenter ());

ApplyImpulse () accepte deux paramètres: le vecteur impulsion du monde et le point d'application de l'impulsion. Pour le moment, nous allons passer un nouveau vecteur 2D en tant que premier paramètre pour sauter, en se déplaçant à gauche et à droite (nous devrons ajuster la façon dont nous gérons la gestion des sauts un peu plus tard). Le second paramètre pour chaque ApplyImpulse la méthode est b2body.GetWorldCenter (). Cette méthode renvoie la position mondiale de la masse centrale de notre héros. C'est important parce que ApplyImpulse changera la vitesse angulaire de notre héros s'il n'agit pas sur sa masse centrale (c'est aussi pourquoi nous avons utilisé l'enregistrement de centre sur le héros en Flash).


Étape 14: Faites face à la force normale

Revenez dans Flash Professional et définissez la classe du symbole Hero sur "view.characters.HeroCharacter" et laissez la classe de base vierge. Ensuite, définissez le nom d’instance de votre instance Hero sur "hero".

Dans les paramètres de composant du composant World, désélectionnez "allowDragging" et sélectionnez "scrolling". De cette façon, l'utilisateur ne pourra pas faire glisser votre personnage avec la souris et la caméra suivra votre joueur lorsqu'il se déplacera. Enfin, dans le champ "focusOn", tapez "hero", le nom de l'instance de votre héros..

Appuyez sur Ctrl + Entrée pour tester le film. Vous remarquerez que vous pouvez déplacer votre personnage en appuyant à gauche et à droite et que vous pouvez sauter avec l'espace. Mais si vous continuez à appuyer sur l'espace, vous continuerez à sauter indéfiniment.

La raison pour laquelle nous ne pouvons pas continuer à sauter indéfiniment, c'est qu'une fois que nous sommes en vol, nous n'avons rien à faire pour que nos pieds nous poussent à monter. Il n'y a pas de force égale à nos pieds qui repoussent. Lorsque nous sommes plantés fermement sur le sol, la force qui nous aide à sauter et nous empêche de tomber à travers le sol est appelée force normale. Ce que nous devons faire, c'est déterminer quelle est la force normale exercée sur nos joueurs. S'il n'y a pas de force normale, il ne peut pas sauter. Nous ferons cela en utilisant notre liste de contacts.

Retournez dans FlashDevelop. Modifions encore une fois notre gestionnaire d’événements step:

 fonction privée 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 ()); autres si (à gauche) b2body.ApplyImpulse (nouvelle V2 (-. 5, 0), b2body.GetWorldCenter ()); autre si (à droite) b2body.ApplyImpulse (nouvelle V2 (.5, 0), b2body.GetWorldCenter ());

Nous allons écrire le code pour le getNormalForce () méthode en une seconde. Ce que nous voulons faire ici, c’est rechercher des contacts (notre joueur touche-t-il quelque chose?), Obtenir un collecteur décrivant où notre joueur touche un contact (latéral ou inférieur) et accélérer le joueur vers le haut s’il touche le sol. S'il n'y a pas de contacts, notre héros doit être dans les airs. Dans ce cas, le multiple serait nul et le joueur serait incapable de sauter.

Maintenant écrivons le getNormalForce () méthode.

 fonction privée getNormalForce (): b2WorldManifold var manifold: b2WorldManifold = null; contacts.forEach (fonction (touches: Array, contactEvent: ContactEvent) var tempManifold: b2WorldManifold = contactEvent.getWorldManifold (); if (tempManifold.normal.y> 0) tempManifold.normal = new V2 (0, tempManifold.normal. nouveau). y); manifold = tempManifold;); contacts.clean (); retour collecteur; 

Avant d'appeler getNormalForce (), nous vérifions si notre joueur est en contact avec quoi que ce soit. S'il ne le fait pas, nous savons qu'il est en vol. La raison principale de cette fonction est d'empêcher le joueur de faire un deuxième saut d'un mur ou du côté d'une plate-forme..

Tout d'abord, nous déclarons une variable locale appelée collecteur et le mettre à nul. C'est le paramètre que nous allons retourner. Si le personnage du héros est en contact avec quelque chose à sa gauche ou en haut à droite (mais pas au sol), cette fonction retournera une variété nulle.

Utiliser la méthode contacts.forEach (), nous pouvons vérifier chaque ContactEvent dans notre liste de contacts. Tous les ContactEvents ont une propriété worldManifold. Nous créons donc une autre variable locale appelée tempManifold et lui affectons la valeur renvoyée par contactEvent.GetWorldManifold. Ensuite, nous vérifions si temp.normal.y est supérieur à zéro. Ici, nous demandons, y at-il une force normale sur l'axe des y?

Si le héros est au sol ou sur une plate-forme, nous mettons à zéro toute force normale sur l'axe des x. Si vous ne le faites pas, un buggy saute lorsque le joueur est poussé contre un mur. N'hésitez pas à expérimenter avec cela. Si vous ne remettez pas le x à zéro, le joueur obtiendra une sorte de capacité de saut de mur de Metroid (mais non fiable).

Enfin, nettoyez la liste de contacts. Nous ne voulons pas gérer les mêmes contacts plus d'une fois.


Étape 15: Ajouter des pièces

Maintenant que nous avons un protagoniste qui peut courir et sauter, ajoutons quelques objets qu'il peut ramasser. Retournez dans Flash Professional, tracez un cercle ou une ellipse pour une pièce et convertissez-la en symbole. Définissez les classes et classes de base comme indiqué:

Mettez autant d’occurrences de la classe de pièces que vous voulez sur la scène. Dans Paramètres de composant, je règle le type de chaque pièce sur statique afin qu'ils ne soient pas affectés par la gravité et puissent flotter comme Mario, mais c'est à vous de voir.


Étape 16: Gérez les collisions avec des pièces

En ce moment, les pièces sont immobiles, objets statiques. Nous aimerions changer cela. Retournez à FlashDevelop et ouvrez le HeroCharacter classe. Ajoutez un gestionnaire d'événements pour les collisions comme ceci:

 fonction privée this_beginContactHandler (e: ContactEvent): void 

Il s'agit du gestionnaire de l'écouteur créé à l'étape 11. Ajoutez le code suivant:

 fonction privée this_beginContactHandler (e: ContactEvent): void var pièce: Coin = e.other.m_userData en tant que pièce; if (coin) coin.remove (); 

Premièrement, nous créons une var locale appelée pièce de monnaie Il s'agit du même type que la classe de pièces créée dans Flash. ContactEvent garde la trace de l’autre appareil Box2D impliqué dans la collision. Si c'est Coin, nous le retirons de la scène, donnant l'illusion qu'il a été collecté.


Étape 17: Garder le score

Créez un dossier dans le répertoire \ src \ appelé 'modèle'. Dans 'modèle', créez un dossier appelé 'tableau de bord' et créez une nouvelle classe appelée ScoreBoard qui s'étend EventDispatcher. Étant donné que nous souhaitons n'avoir qu'une seule instance du tableau de bord à la fois, nous allons suivre le modèle de conception Singleton. Il y avait un conseil rapide sur le modèle Singleton sur Activetuts + plus tôt cette année si vous voulez une référence.

Écrivez le code suivant dans la classe ScoreBoard:

 package model.scoreboard import flash.errors.IllegalOperationError; import flash.events.Event; import flash.events.EventDispatcher; Classe publique ScoreKeeper étend EventDispatcher private static var _instance: ScoreKeeper; fonction publique ScoreKeeper () if (_instance! = null) renvoie new IllegalOperationError ("Utilisez ScoreBoard.getInstance () pour obtenir une référence à Singleton ScoreKeeper.");  else initialize ();  fonction privée initialize (): void  fonction statique publique getInstance (): ScoreKeeper if (_instance == null) _instance = new ScoreKeeper (); retourner _instance; 

C'est le modèle Singleton. Nous nous attendons à ce que toute classe souhaitant accéder à ScoreKeeper utilise la fonction statique getInstance (). Si une instance existe déjà et que quelqu'un (un autre développeur de votre équipe, par exemple) essaie d'instancier le ScoreKeeper par le biais de son constructeur, il recevra notre message d'erreur lui indiquant que le scoreKeeper ne doit être accessible que par le biais de getInstance ().

ScoreKeeper étend EventDispatcher pour pouvoir distribuer des événements lorsque le score change. Nous allons construire un tableau de résultats en tant que composant d'affichage qui s'abonnera aux événements ScoreKeeper..

Maintenant, nous avons besoin de ScoreKeeper pour commencer à garder le score. Nous avons besoin d’une variable pour contenir le score, d’une méthode qui incrémente le score, d’un getter pour le score afin que les autres classes puissent y accéder et d’un const statique public pour stocker notre type d'événement.

package model.scoreboard import flash.errors.IllegalOperationError; import flash.events.Event; import flash.events.EventDispatcher; public class ScoreKeeper étend EventDispatcher const statique public SCORE_CHANGED: String = "SCORE_CHANGED"; private var _score: uint; private static var _instance: ScoreKeeper; fonction publique ScoreKeeper () if (_instance! = null) renvoie new IllegalOperationError ("Utilisez ScoreBoard.getInstance () pour obtenir une référence à Singleton ScoreKeeper."); else initialize (); fonction privée initialize (): void _score = 0; fonction publique incrementScore (): void _score ++; dispatchEvent (nouvel événement ("SCORE_CHANGED")); fonction statique publique getInstance (): ScoreKeeper if (_instance == null) _instance = new ScoreKeeper (); retourner _instance; fonction publique get score (): uint return _score;

Et c'est tout ce dont nous avons besoin pour notre ScoreKeeper. Créons maintenant un composant de vue pour afficher le numéro de partition. Allez en Flash et sur la scène (pas à l'intérieur du symbole Monde), tracez un tableau de bord. La seule chose importante ici est que vous utilisiez l'outil Texte pour dessiner un TextField avec le nom d'occurrence 'But'. Convertissez le TextField en un symbole de clip appelé ScoreBoard.

De retour dans FlashDevelop, dans le dossier world, créez une classe appelée 'ScoreDisplay' qui étend MovieClip. Tout ce que nous avons à faire ici est d’obtenir une instance de ScoreKeeper et de souscrire à ses événements. Ça devrait ressembler à ça:

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

Retournez dans Flash et ouvrez les propriétés du symbole ScoreBoard dans la bibliothèque. Changer la classe en view.world.ScoreDisplay.

Vous avez une dernière étape. Retournez à la classe HeroCharacter et ajoutez deux lignes de code:

 fonction privée this_beginContactHandler (e: ContactEvent): void var pièce: Coin = e.other.m_userData en tant que pièce; if (coin) coin.remove (); scoreBoard.incrementScore (); 
 Classe publique HeroCharacter. Etend Box private var contacts: ContactList; var scoreKeeper privé: ScoreKeeper = ScoreKeeper.getInstance ();

Étape 18: Ajouter des plates-formes statiques

Allez dans Flash Professsional et placez une instance de StaticBox (le même que nous avions l'habitude de faire les murs et le sol) dans l'instance mondiale. Assurez-vous que vous définissez son type sur statique dans les paramètres des composants et que la plate-forme est suffisamment basse pour que votre joueur puisse y accéder.


Étape 19: Ajouter des plates-formes suspendues avec des joints Box2D

WCK facilite la création de plateformes pivotantes. Nous pouvons tout faire dans l'IDE Flash sans écrire de code.

Commencez par dessiner un cercle. Convertir le cercle en un symbole appelé Mixte et définissez la classe de base sur wck.Joint. Ensuite, faites un clic droit sur le Mixte symbole dans la bibliothèque et aller à Définition du composant. Définir la classe comme wck.Joint. Dans le panneau Propriétés, définissez le nom de l'instance comme suit: ancre et dans Paramètres de composant, modifiez le type à Revolute. C'est l'articulation qui donnera à notre plateforme une action pendulaire.

Dessinez une plate-forme avec l'outil Rectangle. Sélectionnez-le et convertissez-le en symbole. Définissez la classe de base sur extras.Plateforme. Faites un clic droit sur le symbole dans la bibliothèque et dans Définition du composant, définissez la classe sur extras.Plateforme.

Faites glisser deux autres instances de la classe Joint dans World et placez-les à l'une des extrémités de la plate-forme. La mise en page devrait ressembler à ceci:

Pour chaque nouvelle instance de Joint, allez dans Paramètre de composant et changez type à 'Distance'et dans le target2Name champ écrit 'ancre'. Testez votre film et vous devriez avoir une plateforme pivotante.


Étape 20: Ajoutez des ennemis

Dans FlashDevelop, ajoutez une nouvelle classe au dossier \ characters \ appelée EnnemiCaractère. Voici le code que nous allons écrire (cela vous semblera très familier):

 package view.characters import Box2DAS.Common.V2; importer Box2DAS.Dynamics.ContactEvent; importer Box2DAS.Dynamics.StepEvent; importer des formes.Box; importer wck.ContactList; Classe publique EnemyCharacter. Box private var contacts: ContactList; private var left: Boolean = true; private var right: Boolean; fonction de substitution publique create (): void fixedRotation = true; reportBeginContact = true; super.create (); contacts = new ContactList (); contacts.listenTo (this); listenWhileVisible (world, StepEvent.STEP, world_stepEventHandler, false, 0, true); listenWhileVisible (this, ContactEvent.BEGIN_CONTACT, this_beginContactHandler, false, 0, true);  fonction privée world_stepEventHandler (e: StepEvent): void if (à gauche) b2body.ApplyImpulse (nouvelle version 2 (-. 1, 0), b2body.GetWorldCenter ());  else if (right) b2body.ApplyImpulse (nouvelle version 2 (.1, 0), b2body.GetWorldCenter ());  fonction privée this_beginContactHandler (e: ContactEvent): void var wall: StaticBox = e.other.m_userData as StaticBox; si (mur) gauche =! gauche; right =! right; 

La seule chose nouvelle ici est que chaque fois que l'objet entre en collision avec un mur, il change de direction. Et chaque événement de pas, le personnage ennemi aura une impulsion appliquée dans la direction à laquelle il fait face.

Retournez dans Flash et dessinez un personnage ennemi et convertissez-le en symbole avec la classe de base définie sur view.characters.EnemyCharacter et classe mis à Ennemi.

La dernière chose à faire est de gérer le contact entre le personnage joueur et le personnage ennemi. dans le HeroCharacter classe, ajoutez le code suivant:

 fonction privée this_beginContactHandler (e: ContactEvent): void var pièce: Coin = e.other.m_userData en tant que pièce; trace (pièce de monnaie); if (coin) coin.remove (); scoreKeeper.incrementScore ();  else var ennemi: EnemyCharacter = e.other.m_userData en tant que EnemyCharacter; if (ennemi) var tempManifold: b2WorldManifold = e.getWorldManifold (); if (tempManifold.normal.y> 0) Util.addChildAtPosOf (world, new BadGuyFX (), ennemi); ennemi.remove (); 

Si notre héros entre en contact avec quelque chose et que ce n'est pas une pièce de monnaie, nous allons vérifier si c'est le cas. EnnemiCaractère. Si tel est le cas, nous vérifierons le collecteur du ContactEvent pour déterminer si nous avons frappé le méchant sur le dessus ou sur le côté. Si nous sautons sur lui, il sera retiré de la scène.

Je voulais ajouter une animation de EnemyCharacter qui était écrasée. Dans Flash, j'ai donc créé un clip avec une animation sur la chronologie de l'ennemi écrasé. Je fixe la classe de base de cette BadGuyFX objecter à misc.FX, une classe dans la bibliothèque WCK qui lit une fois sa propre animation de scénario, puis se définit nul. Puis je l'ai ajouté à la scène avec le Util méthode addChildAtPosOf (). L'animation fait que l'élimination de l'ennemi ne semble pas si soudaine.


Conclusion

Maintenant que vous avez un prototype fonctionnel de plateforme, je vous encourage à continuer à explorer ce que WCK a à offrir. Je recommande particulièrement de jouer dans les paramètres de composant de vos objets de jeu. C'est un moyen très amusant et rapide de modifier la physique de votre monde de jeu sans écrire de code. J'espère que vous avez apprécié ce tutoriel! Merci d'avoir lu!