Avez-vous déjà été surpris par la variété d'attaques dans des jeux de combat comme Mortal Kombat, Super Smash Bros, Soul Calibur et d'autres? Maintenant, vous pouvez apprendre à créer un moteur pour détecter les combinaisons clés et créer votre propre jeu de combat.!
Jetons un coup d'œil au résultat final sur lequel nous allons travailler:
Les combos dans cette démo sont: ASDF
, AAA
, et SSS
. Les taper!
Vous avez toujours voulu construire un jeu de combat (ou tout autre genre) avec beaucoup de combos? Dans ce didacticiel, nous allons créer une classe simple pour détecter les combinaisons clés et nous dire quand une combinaison a été effectuée par l'utilisateur. Nous allons également créer une interface graphique très simple pour nous permettre de tester notre classe.
Pour ce tutoriel, nous allons utiliser le projet AS3 pur de FlashDevelop avec préchargement. Nous allons créer un projet avec un préchargeur uniquement pour vous faciliter la tâche si vous souhaitez continuer à travailler sur le résultat final du jeu. Commençons par ouvrir FlashDevelop et en sélectionnant notre projet:
Avec ça, on peut commencer à travailler sur nos cours.
Pour utiliser les graphiques que nous allons créer dans Flash Pro dans notre projet AS3, nous devons exporter nos images à partir du fichier .fla au format .swc. Vous trouverez plus d’informations sur ce format dans l’option 2 de ce guide de FlashDevelop. Créez un nouveau fichier FLA AS3 dans Flash Professional, puis modifiez les paramètres de notre fichier .fla pour exporter son contenu au format .swc: aller à Fichier> Paramètres de publication (ou appuyez sur Ctrl + Maj + F12) et cochez la case "Exporter SWC" sous l'onglet "Flash".
Si vous n'avez pas Flash Professional, ne vous inquiétez pas. J'ai inclus le fichier SWC final dans le package de téléchargement de ce didacticiel. Téléchargez-le, puis passez à l'étape 6.
Nous allons d'abord créer toute la partie graphique et ne nous préoccuper que du code par la suite. Puisque nous allons traiter de combinaisons de touches, créons un bouton avec une lettre pour représenter une clé. Notre bouton sera très simple: trois cercles avec des couleurs différentes et des filtres. C'est ainsi que j'ai construit le mien: un grand cercle gris avec un cercle blanc au-dessus et un cercle rouge au-dessus du cercle blanc. Après cela, j'ai appliqué une lueur et deux filtres d'ombre portée sur le cercle rouge afin d'obtenir le résultat final, qui est inclus dans les fichiers source..
Pour plus de détails sur la création du bouton, récupérez les fichiers sources de ce tutoriel.!
Nous devons maintenant donner à notre bouton les images "up" et "down". Avant de faire cela, nous devons en faire un symbole. Convertissons-le en symbole, nommez-le KeyButtonImage
et exportez-le en tant que "SWCAssets.KeyButtonImage". Nous ajoutons le SWCAssets
package dans le nom de la classe à des fins d'organisation lorsque nous commençons à coder. Ce sera plus clair plus tard.
Sur notre KeyButtonImage
symbole, créons une autre image clé avec la même image que la première, puis inversons l’angle des filtres que nous utilisons sur le cercle rouge. Nous devrons également étiqueter nos cadres afin de les identifier dans notre code. Par conséquent, identifiez le premier cadre comme "Haut" et le deuxième cadre comme "Bas". L'image vers le bas devrait ressembler à ceci:
Maintenant que notre image de bouton est prête, il est temps de générer notre fichier .swc et de l'ajouter à notre projet FlashDevelop. Pour publier, appuyez sur Alt + Shit + F12. Vous remarquerez qu'un fichier .swc a été créé dans le même répertoire que le fichier flash. Copiez ce fichier et placez-le dans le dossier "lib" de notre projet FlashDevelop. Faites un clic droit dessus et sélectionnez "Ajouter à la bibliothèque" pour que FlashDevelop reconnaisse le fichier. Le nom du fichier deviendra bleu une fois ajouté à la bibliothèque..
FlashDevelop est maintenant prêt à utiliser notre image de bouton!
Notre image est prête, nous avons donc besoin de créer une classe pour la conserver et y ajouter des fonctionnalités. Dans FlashDevelop, ajoutez une nouvelle classe dans le dossier src, nommez-la KeyButton
et mettez flash.display.Sprite en tant que classe de base.
Depuis notre KeyButton
Si la classe hérite de la classe Sprite, elle peut ajouter des images à sa liste d’affichage enfant. Dans cette étape, nous allons ajouter l'image à notre classe et y insérer le texte de la lettre. Passons au code:
package import flash.display.Sprite; import flash.text.TextField; import flash.text.TextFormat; import flash.text.TextFormatAlign; importer SWCAssets.KeyButtonImage; Classe publique KeyButton étend Sprite private var _image: KeyButtonImage; private var _text: TextField; fonction publique KeyButton (letter: String) _image = new KeyButtonImage (); _image.stop (); addChild (_image); _text = new TextField (); _text.defaultTextFormat = new TextFormat ("Verdana", 28, 0xFFFFFF, true, null, null, null, null, null, TextFormatAlign.CENTER); _text.text = lettre; _text.height = 38; _text.x = - (_ text.width / 2); _text.y = - (_ text.height / 2); _text.mouseEnabled = false; addChild (_text);
Aux lignes 11 et 13, nous déclarons des variables qui contiendront l'image de notre bouton et le texte de la lettre, respectivement. Dans le constructeur de notre classe (ligne 15), nous demandons une chaîne, qui sera la lettre que notre bouton représentera.
Depuis notre KeyButtonImage
a deux cadres, dans la ligne 18, nous appelons le Arrêtez()
méthode pour l'empêcher de les parcourir en boucle. Nous définirons des moments spécifiques pour que l'image bascule ultérieurement. La ligne 20 ajoute l'image à la liste des enfants du bouton..
De la ligne 22 à la ligne 30, nous créons notre champ de texte qui contiendra une lettre, nous la positionnerons et le désactivera des événements de la souris (pas nécessaire, mais c'est utile si votre champ de texte est censé ne rien faire, mais afficher le texte). La ligne 32 ajoute le texte à la liste des enfants du bouton..
Notre KeyButton
La classe peut déjà afficher une image et représenter une lettre. Nous allons donc ajouter quelques boutons à l’écran. Comme nous construisons uniquement un exemple pour tester notre classe, nous n’ajouterons pas toutes les lettres de cet exemple. Au lieu de cela, nous ne travaillerons qu'avec 4 lettres (mais notre classe sera capable de détecter des combinaisons avec n'importe quelle touche!): A, S, D et F. Nous les ajouterons maintenant à notre écran:
touches var privées: Array = []; clés var privées: Array = ["A", "S", "D", "F"]; fonction privée init (e: Event = null): void removeEventListener (Event.ADDED_TO_STAGE, init); var i: int; pour (i = 0; i < 4; i++) keyButtons[i] = new KeyButton(keys[i]); KeyButton(keyButtons[i]).x = 100 + (100 * i); KeyButton(keyButtons[i]).y = 50; addChild(KeyButton(keyButtons[i]));
La ligne 1 crée un tableau contenant tous les boutons de notre écran. Cela sera très utile plus tard, car cela nous permettra de parcourir le tableau au lieu de vérifier bouton par bouton. La ligne 2 ne définit que les touches avec lesquelles nous allons travailler (comme indiqué, A, S, D et F). Les lignes 12 à 16 sont dans une boucle qui créera les 4 boutons et les positionnera à l'écran.
Vous pouvez maintenant compiler le projet et voir les boutons à l'écran:
Nous sommes prêts maintenant à commencer à travailler sur la détection des combos. Pour cela, nous allons créer un ComboHandler
classe. Suivez simplement les étapes que vous avez suivies pour créer le KeyCombo
classe, mais cette fois notre ComboHandler
la classe n'aura pas de classe de base.
Quelle devrait être la première partie de la ComboHandler
classe? Eh bien, nous devons d’abord détecter le moment où une touche a été actionnée. Pour ce faire, nous devons ajouter un écouteur d'événement à la scène (rappelez-vous: comme suggéré par la référence ActionScript 3, afin d'écouter globalement pour KeyboardEvent
les auditeurs de l'événement, ils devraient être ajoutés à la scène!
package import flash.display.Stage; import flash.events.KeyboardEvent; Classe publique ComboHandler fonction statique publique initialize (stageReference: Stage): void stageReference.addEventListener (KeyboardEvent.KEY_DOWN, onKeyDown); fonction statique privée onKeyDown (e: KeyboardEvent): void
Ce code ne construit que la structure de base du ComboHandler
classe. Beaucoup d'autres seront ajoutés plus tard! Notez que nous n’utilisions que des méthodes statiques. C’est parce que nous n’aurons qu’un seul ComboHandler
classe dans notre exemple. Quelques suggestions sur les améliorations à apporter à cette classe sont disponibles dans l'étape de conclusion..
Notre ComboHandler
la classe doit être initialisée à travers le initialiser()
méthode afin que l'auditeur soit ajouté à la scène. Dans notre Principale
classe, nous devrions initialiser la classe avant de travailler avec elle. Direction Main.as et faisons cela:
fonction privée init (e: Event = null): void removeEventListener (Event.ADDED_TO_STAGE, init); var i: int; pour (i = 0; i < 4; i++) keyButtons[i] = new KeyButton(keys[i]); KeyButton(keyButtons[i]).x = 100 + (100 * i); KeyButton(keyButtons[i]).y = 50; addChild(KeyButton(keyButtons[i])); ComboHandler.initialize(stage);
Nous avons la structure de base du ComboHandler
classe construite, alors maintenant nous devons ajouter des choses. La première chose à faire est d’enregistrer des combos dans la classe pour qu’il détecte un combo..
Maintenant, comment allons-nous stocker les combos dans cette classe? Vous avez peut-être entendu parler de la classe Dictionary. Cette classe peut contenir n'importe quelle valeur basée sur une clé. Dans notre classe, les clés vont être les noms de combo et la valeur sera un tableau, chaque index étant une clé du combo. Le code pour cela (expliqué ci-dessous):
combos privés de var statique: Dictionnaire; fonction statique publique initialize (stageReference: Stage): void combos = new Dictionary (); stageReference.addEventListener (KeyboardEvent.KEY_DOWN, onKeyDown); fonction statique publique registerCombo (comboName: String, comboKeys: Array): Boolean if (combos [Nom de la liste]]) return false; combos [comboName] = comboKeys; retourne vrai;
À la ligne 1, nous créons le dictionnaire dont nous avons parlé. La ligne 5 l’initialise et la fonction registerCombo ()
inscrit un combo dans le dictionnaire. Cette fonction retournera vrai
si le combo a été enregistré avec succès, ou faux
s'il y avait déjà un combo portant ce nom dans la classe (dans ce cas, vous devrez peut-être supprimer l'ancien combo - voir l'étape 19 pour cela!).
Une autre chose que notre classe devrait avoir est un intervalle maximum entre chaque pression de touche. Dans certains jeux comportant des combos, vous avez probablement remarqué que lorsque vous appuyez sur la touche A, par exemple, attendez une seconde et appuyez sur la touche B (en supposant qu'il existe le combo "AB"), aucun combo ne sera détecté, car vous avez également attendu beaucoup à appuyer sur la touche B. Cela se produit car il existe un intervalle maximum entre chaque pression de touche. C'est exactement ce que nous ferons dans notre classe. Donc, dans le ComboHandler
classe:
var statique statique privéeKeys: Array; statique privée privée MAX_INTERVAL: int = 250; // Millisecondes private static var interval: int; fonction statique publique initialize (stageReference: Stage): void combos = new Dictionary (); intervalle = 0; stageReference.addEventListener (KeyboardEvent.KEY_DOWN, onKeyDown); fonction statique privée onKeyDown (e: KeyboardEvent): void if (getTimer () - intervalle> MAX_INTERVAL) coloredKeys = []; intervalle = getTimer (); pressureKeys.push (e.keyCode);
En ligne 1, nous créons un tableau appelé touches pressées
. Ce tableau contient toutes les touches sur lesquelles l'utilisateur appuie, l'intervalle de temps entre deux touches étant inférieur à l'intervalle maximum..
Les lignes 3 et 4 définissent un MAX_INTERVAL
constante, qui sera notre intervalle maximum, et la intervalle
variable, ce qui nous aidera à calculer quel était l'intervalle de temps entre deux appuis sur une touche.
le onKeyDown ()
La fonction est presque terminée: nous y détectons d’abord si le délai entre l’appui actuel et le dernier appui est supérieur à l’intervalle maximal. Si tel est le cas, nous réinitialisons notre touches pressées
tableau, pour supprimer toutes les clés qui y étaient. Après cela, nous mettons à jour la variable d’intervalle à l’heure actuelle (voir la documentation de getTimer () pour plus de détails sur la façon dont nous calculons l’intervalle) et pousser()
la clé actuelle de la touches pressées
tableau.
Une dernière chose manque dans notre ComboHandler
de onKeyDown ()
fonction: possibilité de vérifier si, après avoir appuyé sur une touche, l'utilisateur a effectué une combinaison. C'est ce que nous allons faire maintenant:
fonction statique privée onKeyDown (e: KeyboardEvent): void if (getTimer () - intervalle> MAX_INTERVAL) coloredKeys = []; intervalle = getTimer (); pressureKeys.push (e.keyCode); checkForCombo (); fonction statique privée checkForCombo (): void var i: int; var comboFound: String = ""; for (var comboName: Chaîne dans les combos) if (coloredKeys.join ("") .indexOf ((combos [NomCoiff]] sous forme de tableau) .join (""))> -1) comboFound = nomCoiffable; Pause; // Liste déroulante trouvée if (comboFound! = "") ColoredKeys = [];
La ligne 12 est le seul changement que nous avons apporté à notre onKeyDown ()
fonction: appeler le checkForCombo ()
une fonction. Cela vérifiera si un combo a été effectué ou non.
La façon dont nous vérifions si un combo a été exécuté est très intéressante: nous travaillons avec des chaînes. Travailler avec des chaînes, dans ce cas, nous permet de détecter des choses qui auraient été plus difficiles sans travailler avec elles. Par exemple, imaginez si nous avions un combo avec les clés ASDF, mais le touches pressées
tableau a la séquence de clés suivante: ASFDASDF. Même si l’utilisateur a appuyé sur les quatre premières touches ("ASFD", ne pas correspond à un combo) dans le délai imparti, cela ne devrait pas changer le fait que l'utilisateur a effectué un combo, comme indiqué par les 4 dernières touches ("ASDF"). Sans cordes, notre travail aurait pu être beaucoup plus long.
L’idée de travailler avec des chaînes est la suivante: nous mettons toutes les clés dans touches pressées
dans une chaîne, en séparant chaque index par un espace (donc le pressureKeys.join ("")
appel de fonction), puis vérifiez s’il contient une sous-chaîne particulière. Cette sous-chaîne particulière est une chaîne formée par les clés d'un combo, chaque clé étant également séparée par un espace. Si cette sous-chaîne est trouvée, cela signifie qu'un combo a été effectué.
Vous pouvez le tester vous-même avec un code comme celui-ci:
presses-touches = ["A", "S", "F", "D", "A", "S", "D", "F"]; checkForCombo ();
? si vous voulez aussi ajouter un temporaire trace (comboFound)
appelle checkForCombo ()
voir le résultat.
Notez cependant que cette méthode ne fonctionnera pas dans tous les cas. Cela ne fonctionnera pas si, au lieu d'avoir un tableau de chaînes, nous avions un tableau d'objets, par exemple. Si nous avions un tableau d'Object, la fonction par défaut toString () appelée lorsque join () est appelée, afficherait "[objet Object]", de sorte que tous nos objets dans le tableau seraient "identiques" dans la chaîne créée. . Si vous souhaitez toujours le faire, substituez simplement la fonction toString () par défaut et placez-y un texte personnalisé. À l'étape 14, nous ferons cela sur la classe ComboEvent - jetez-y un œil pour référence.!
Maintenant, nous allons arrêter de nous concentrer sur la ComboHandler
classe et travailler à nouveau sur les boutons que nous avons créés. (Supprimez le code de test que vous venez d'ajouter.)
Actuellement, nos boutons sont à l'écran, mais ils ne nous montrent rien. Vous vous souviendrez peut-être que nous avons créé deux images de boutons: une pour le moment où le bouton n'est pas enfoncé et l'autre pour le Dans cette étape, nous allons faire en sorte que nos boutons se comportent quand une touche a été pressée. Allons à notre KeyButton
classe:
fonction publique onUp (): void _image.gotoAndStop ("Up"); fonction publique onDown (): void _image.gotoAndStop ("Down");
Notez que ce code modifie uniquement les cadres de l'image du bouton. Nous devons encore les appeler lorsque la touche correspondante a été enfoncée. Nous ferons cela dans Main.as:
fonction privée init (e: Event = null): void removeEventListener (Event.ADDED_TO_STAGE, init); var i: int; pour (i = 0; i < 4; i++) keyButtons[i] = new KeyButton(keys[i]); KeyButton(keyButtons[i]).x = 100 + (100 * i); KeyButton(keyButtons[i]).y = 50; addChild(KeyButton(keyButtons[i])); ComboHandler.initialize(stage); stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); private function onKeyDown(e:KeyboardEvent):void var i:int; for (i = 0; i < 4; i++) if (String.fromCharCode(e.keyCode) == keys[i]) KeyButton(keyButtons[i]).onDown(); break; private function onKeyUp(e:KeyboardEvent):void var i:int; for (i = 0; i < 4; i++) if (String.fromCharCode(e.keyCode) == keys[i]) KeyButton(keyButtons[i]).onUp(); break;
Les lignes 18 et 19 sont les seuls ajouts à la init ()
une fonction. Ils ajoutent plus d’auditeurs d’événements sur la scène pour détecter le moment où une touche a été appuyée et le moment où une touche a été relâchée. Nous allons utiliser ces deux auditeurs pour indiquer à nos boutons s'ils doivent être montés ou baissés.
La seule chose que vous n’ayez peut-être jamais vue dans onKeyDown ()
et onKeyUp ()
fonctions est le String.fromCharCode ()
une fonction. Cette fonction renvoie une chaîne avec les codes de caractère que vous transmettez en tant qu'arguments. Comme nous ne transmettons qu'un seul code de caractère, cette fonction retournera une chaîne avec un seul caractère. Si elle correspond aux chaînes que nous avons dans le tableau keys, cela signifie que nous devrions indiquer au bouton correspondant d'agir..
Vous pouvez maintenant tester les boutons qui montent et descendent!
En ce moment, notre ComboHandler
La classe détecte les appuis sur les touches, gère les intervalles, vérifie le moment où les combos ont été effectués, mais elle n’agit toujours pas quand un combo a été effectué. Comment peut-il dire d'autres choses qu'un combo a été fait? C'est ce que nous allons commencer ici. Comme Flash possède un système d’événement très puissant, nous allons envoyer un événement pour lequel une combo a été détectée et laisser les autres objets recevoir ces événements..
Pour plus d'informations sur les événements personnalisés, visitez ce lien sur 8bitrocket. Créer le ComboEvent
classe avec ce code dedans:
package import flash.events.Event; Classe publique ComboEvent étend l'événement public static const COMBO_FINISHED: String = "comboFinished"; public var params: Object; fonction publique ComboEvent (type: String, paramètres, Object, bulles: Boolean = false, annulable: Boolean = false) super (type, bulles, annulable); this.params = params; public override function clone (): Event retourne un nouveau ComboEvent (type, this.params, bubbles, cancelable); fonction de substitution publique toString (): String return formatToString ("ComboEvent", "params", "type", "bubbles", "cancelable");
À la ligne 9, nous déclarons le params
variable. Il contiendra des informations sur le combo qui a été effectué (dans cet exemple, nous ne mettrons que le nom, mais vous pouvez mettre ce que vous voulez). Remarquez le cloner()
fonction dans la classe. Il est créé pour permettre aux événements redispatchés de contenir les mêmes informations que l'événement d'origine. Pour plus d'informations à ce sujet, visitez ce blog sur Bit 101
Maintenant, dans notre ComboHandler
classe, il est temps d'agir lorsqu'un combo a été effectué. Pour ce faire, nous devons envoyer un ComboEvent
. Les événements ne peuvent être distribués que par des objets hérités de EventDispatcher
, mais ComboHandler
n'hérite pas de EventDispatcher
. Au lieu de le faire hériter de EventDispatcher
(cela nous obligerait à avoir une instance de ComboHandler
, que nous ne voulons pas pour les besoins de ce tutoriel), nous allons créer un EventDispatcher
object dans la classe et faire en sorte que cet événement envoie des événements. De plus, d'autres classes écouteront cet objet pour les événements. Dans notre fichier ComboHandler.as:
Importer ceci:
import flash.events.EventDispatcher;
Et ajoutez ce code:
public statique var dispatcher: EventDispatcher; fonction statique publique initialize (stageReference: Stage): void combos = new Dictionary (); intervalle = 0; dispatcher = new EventDispatcher (); stageReference.addEventListener (KeyboardEvent.KEY_DOWN, onKeyDown); fonction statique privée checkForCombo (): void var i: int; var comboFound: String = ""; for (var comboName: Chaîne dans les combos) if (coloredKeys.join ("") .indexOf ((combos [NomCoiff]] sous forme de tableau) .join (""))> -1) comboFound = nomCoiffable; Pause; // Liste déroulante trouvée if (comboFound! = "") ColoredKeys = []; dispatcher.dispatchEvent (new ComboEvent (ComboEvent.COMBO_FINISHED, comboName: comboFound));
À la ligne 1, nous déclarons notre objet répartiteur. En ligne 9, nous l'initialisons. À la ligne 34, nous envoyons un ComboEvent
. Et c'est tout pour le ComboHandler
classe. Maintenant, nous devons écouter pour l'événement qui est envoyé.
La vérification des événements personnalisés est effectuée de la même manière que vous traitez avec tout autre événement dans AS3: ajoutez un écouteur au répartiteur et créez une fonction pour faire quelque chose lorsque l'écouteur reçoit un événement. Notre Principale
la classe doit être celle qui reçoit l'événement, car elle affichera quelque chose à l'écran lorsqu'un combo est détecté.
fonction privée init (e: Event = null): void removeEventListener (Event.ADDED_TO_STAGE, init); var i: int; pour (i = 0; i < 4; i++) keyButtons[i] = new KeyButton(keys[i]); KeyButton(keyButtons[i]).x = 100 + (100 * i); KeyButton(keyButtons[i]).y = 50; addChild(KeyButton(keyButtons[i])); ComboHandler.initialize(stage); stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); ComboHandler.dispatcher.addEventListener(ComboEvent.COMBO_FINISHED, onComboComplete); private function onComboComplete(e:ComboEvent):void
La ligne en surbrillance est l'endroit où nous ajoutons l'auditeur à ComboHandler
de répartiteur
.
Dans ce tutoriel, nous allons simplement afficher du texte à l’écran avec le nom du combo effectué. Nous aurons besoin d’un champ de texte à l’écran et nous aurons besoin du nom du combo qui a été exécuté.
private var textField: TextField; fonction privée init (e: Event = null): void removeEventListener (Event.ADDED_TO_STAGE, init); var i: int; pour (i = 0; i < 4; i++) keyButtons[i] = new KeyButton(keys[i]); KeyButton(keyButtons[i]).x = 100 + (100 * i); KeyButton(keyButtons[i]).y = 50; addChild(KeyButton(keyButtons[i])); ComboHandler.initialize(stage); textField = new TextField(); textField.defaultTextFormat = new TextFormat("Verdana", 20, 0x000000, true); textField.x = 100; textField.y = 200; textField.width = 350; textField.text = "No combo"; addChild(textField); stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); ComboHandler.dispatcher.addEventListener(ComboEvent.COMBO_FINISHED, onComboComplete); private function onComboComplete(e:ComboEvent):void textField.text = e.params.comboName;
La ligne 1 contient la déclaration du champ de texte que nous allons utiliser. Les lignes 20 à 27 contiennent l’initialisation du champ de texte. Dans notre onComboComplete ()
fonction, nous ne mettons que le nom de la liste déroulante dans le texte du champ de texte. C'est tout! Maintenant, il ne reste plus qu’à enregistrer des combos et à tester la classe.!
Dans le fichier Main.as, enregistrons des combinaisons: "AAA Combo", "SSS Combo" et "ASDF Combo". Vous pouvez enregistrer autant de combos que vous le souhaitez!
fonction privée init (e: Event = null): void removeEventListener (Event.ADDED_TO_STAGE, init); var i: int; pour (i = 0; i < 4; i++) keyButtons[i] = new KeyButton(keys[i]); KeyButton(keyButtons[i]).x = 100 + (100 * i); KeyButton(keyButtons[i]).y = 50; addChild(KeyButton(keyButtons[i])); ComboHandler.initialize(stage); ComboHandler.registerCombo("AAA Combo", [65, 65, 65]); ComboHandler.registerCombo("SSS Combo", [83, 83, 83]); ComboHandler.registerCombo("ASDF Combo", [65, 83, 68, 70]); textField = new TextField(); textField.defaultTextFormat = new TextFormat("Verdana", 20, 0x000000, true); textField.x = 100; textField.y = 200; textField.width = 350; textField.text = "No combo"; addChild(textField); stage.addEventListener(KeyboardEvent.KEY_DOWN, onKeyDown); stage.addEventListener(KeyboardEvent.KEY_UP, onKeyUp); ComboHandler.dispatcher.addEventListener(ComboEvent.COMBO_FINISHED, onComboComplete);
Compilez le projet et c'est ce que vous obtenez:
Et si nous voulions supprimer un combo qui a été enregistré? La fonction suivante peut être ajoutée dans le fichier ComboHandler.as pour rétablir la position par défaut du dictionnaire de combinaisons. Il retournera true si le combo a été supprimé, et false s'il ne l'était pas (il n'y avait pas de combo enregistré avec ce nom).
Fonction statique publique removeCombo (comboName: String): Boolean if (combos [nom_duCombo]) combos [NomduChoix] = undefined; retourne vrai; return false;
Félicitations pour avoir terminé ce tutoriel! Vous êtes prêt à implémenter un gestionnaire de combo de base pour vos jeux.!
Cependant, un gestionnaire de combo de base ne convient pas à tous les jeux. Et si vous vouliez utiliser un jeu avec des personnages différents, et que chaque personnage avait ses combinaisons, vous deviez avoir plus de contrôle sur les gestionnaires? Vous pouvez facilement le faire si vous autorisez l’instanciation du ComboHandler
classe, qui restera comme un défi pour vous.
Vous pouvez également transformer cette classe en Singleton, au lieu d’avoir uniquement des fonctions statiques. Il existe de nombreuses autres utilisations créatives, notamment enregistrer des mots en tant que combo et vérifier si quelqu'un a tapé un mot ou non..
Avez-vous eu un usage créatif pour ce cours? Partagez-le avec nous dans la section commentaires!