Oppdager Nøkkelsett, de enkle Way

Detecting Nøkkelsett, den enkle måten
en
Del
en
Del

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

Har du noen gang blitt overrasket over det mangfoldet av angrepene i slåssespill som Mortal Kombat, Super Smash Bros, Soul Calibur og andre? Nå kan du lære å lage en motor til å oppdage tastekombinasjoner og bygge din egen slåssespill også!




Endelig resultat Forhåndsvisning

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

De kombinasjoner i denne demoen er: asdf, AAA, og SSS. Skriv dem



Trinn 1: Innledning

Noen gang ønsket å bygge et slåssespill (eller en annen sjanger) med mange kombinasjoner? I denne opplæringen vil vi lage en enkel klasse for å oppdage viktige kombinasjoner og fortelle oss når en combo har blitt gjort av brukeren. Vi vil også lage en veldig enkel grafisk grensesnitt for å la oss teste vår klasse



Trinn 2:. Starter et nytt prosjekt

For denne opplæringen, vil vi bruke FlashDevelop er ren AS3 prosjekt med preloader. Vi vil skape et prosjekt med en preloader bare for å gjøre det enkelt for deg hvis du ønsker å fortsette arbeidet på det endelige resultatet mot et spill. La oss begynne med å åpne FlashDevelop og velge vårt prosjekt:

Med det, kan vi begynne å jobbe på våre klasser

For å kunne bruke grafikken vi skal lage i Flash Pro innenfor vår AS3 prosjekt. trenger vi å eksportere våre bilder fra FLA filen til en .swc format. Mer informasjon om dette formatet kan bli funnet i Alternativ 2 av denne guiden til FlashDevelop. Opprett en ny AS3 FLA i Flash Professional, og deretter endre innstillingene på vår FLA fil for å eksportere innholdet til en .swc format: gå til Fil > Publish Settings plakater (eller trykk Ctrl + Shift + F12) og sjekke "Export SWC" boksen under "Flash" -kategorien.

Hvis du ikke har Flash Professional, ikke bekymre deg. Jeg har tatt den endelige SWC-filen i nedlastingspakken for denne opplæringen. Last den ned, gå til trinn 6.



Trinn 3: Den grunnleggende formen Button

Vi vil først lage all den grafiske delen og bekymring bare med koden senere. Siden vi skal håndtere viktige kombinasjoner, la oss lage en knapp med et brev i det å representere en nøkkel. Vår knappen vil være svært enkel: tre sirkler med forskjellige farger og noen filtre i den. Det er hvordan jeg bygget min: en stor grå sirkel med en hvit sirkel på toppen av det, og en rød sirkel på toppen av den hvite. Etter det søkte jeg en glød og to Skygge filtre på den røde sirkelen for å få det endelige resultatet, som er inkludert i kildefilene.

For mer informasjon om hvordan knappen ble bygget, ta tak i kildefilene for denne opplæringen



Trinn 4: Opp og Ned Images

Vi har nå for å gi vår knappen "opp" og "ned" bilder. Før du gjør det, må vi gjøre det til et symbol. La oss konvertere den til et symbol, gi den et navn på KeyButtonImage og eksportere den som "SWCAssets.KeyButtonImage". Vi legger den SWCAssets pakken i klassenavnet for organisasjonens formål når vi starter koding. Dette vil være mer tydelig senere.

På vår KeyButtonImage symbol, la oss lage en annen nøkkelbilde med det samme bildet av den første, og deretter snu vinkelen filtrene som vi bruker på den røde sirkelen. Vi trenger også å merke våre rammer for å identifisere dem i vår kode, så merkes det første bildet som "Up" og den andre rammen som "Down". Ned bildet skal se slik ut:



Trinn 5: Generering av .swc File

Nå som vi har vår knappen image klar, er det tid for å generere vår .swc fil og legge det til vår FlashDevelop prosjekt. For å publisere, trykk Alt + Faen + F12. Du vil merke at en .swc filen har blitt opprettet i samme katalog av flash-fil. Kopier denne filen og sette den i "lib" -mappen fra vår FlashDevelop prosjekt. Høyreklikk på den og velg "Legg til i bibliotek" for å gjøre FlashDevelop gjenkjenne filen. Navnet på filen vil bli blått når den er lagt til biblioteket

FlashDevelop er nå klar til å begynne å bruke knappen vår image



Trinn 6:.! Vår KeyButton Class Anmeldelser

Vårt bilde er klar, så vi trenger for å lage en klasse for å holde bildet og legge funksjonaliteten til det. I FlashDevelop, legge til en ny klasse i src mappen, navn det KeyButton og sette flash.display.Sprite som base klassen



Trinn 7:. Legge bilde

Siden vår KeyButton klassen arver fra Sprite klasse, kan det legge bilder til sin barnet skjerm listen. I dette trinnet vil vi legge til bildet i klassen vår, og la brevet teksten inni den. La oss hoppe til koden:
pakke {import flash.display.Sprite; import flash.text.TextField; import flash.text.TextFormat; import flash.text.TextFormatAlign; import SWCAssets.KeyButtonImage; public class KeyButton strekker Sprite {private Var _image: KeyButtonImage; private Var _text: Textfield; offentlig funksjon KeyButton (brev: String) {_image = new KeyButtonImage (); _image.stop (); addChild (_image); _text = new Textfield (); _text.defaultTextFormat = new tekstformat ("Verdana", 28, 0xFFFFFF, sant, null, null, null, null, TextFormatAlign.CENTER); _text.text = brev; _text.height = 38; _text.x = - (_ text.width /2); _text.y = - (_ text.height /2); _text.mouseEnabled = false; addChild (_text); }}}

I linjene 11 og 13, erklærer vi variabler som vil holde bildet av vår knappen og teksten i brevet, henholdsvis. I konstruktøren av vår klasse (linje 15) ber vi om en streng, som vil være det brevet som vår knappen vil representere.

Siden vår KeyButtonImage har to rammer, i linje 18 kaller vi det stopp () metoden å stoppe den fra looping gjennom dem. Vi vil definere bestemte øyeblikk for bildet for å bytte rammer senere. Linje 20 legger bildet til knappens barnet listen.

Fra linje 22 til linje 30, skaper vi vår tekstfeltet som skal inneholde et brev, plasser den og deaktivere den fra mus hendelser (ikke nødvendig, men godt å gjøre hvis tekstfeltet er ment å gjøre noe annet enn å vise teksten). Linje 32 legger teksten på knappens barnet liste



Trinn 8:. Opprette bildeObjekter

Vår KeyButton klasse kan allerede vise et bilde og representerer et brev, så i dette trinnet Vi vil legge til et par knapper på skjermen. Siden vi bygger bare et eksempel for å teste vår klasse, vil vi ikke legge alle bokstavene i eksempelet. I stedet vil vi jobbe bare med 4 bokstaver (men vår klasse vil være i stand til å oppdage komboer med noen taster!): A, S, D og F. Vi vil legge dem til vår skjerm nå:
private Var keyButtons: Array = []; private Var Taster: Array = ["A", "S", "D", "F"]; privat funksjon init (e: Hendelses = null): void {removeEventListener (Event.ADDED_TO_STAGE, init); Var i: int; for (i = 0; i < 4; i ++) {keyButtons [i] = nye KeyButton (keys [i]); KeyButton (keyButtons [i]) x = 100 + (100 * i).; KeyButton (keyButtons [i]) y = 50.; addChild (KeyButton (keyButtons [i])); }}

Linje 1 skaper en matrise for å inneholde alle knappene i vår skjerm. Dette vil være svært nyttig senere, fordi den vil gi oss sløyfe gjennom matrisen stedet for å kontrollere knapp av knappen. Linje 2 definerer hvilke taster som vi skal jobbe med (som sagt, A, S, D og F). Lines 12-16 er inne i en løkke som vil skape de 4 knapper og plassere dem på skjermen

Nå kan du kompilere prosjektet og se knappene i skjermbildet.



Trinn 9: Opprette ComboHandler Class

Vi er klar nå til å begynne å jobbe på påvisning av kombinasjoner. For det, vil vi lage en ComboHandler klasse. Bare følg de samme trinnene du gjorde for å opprette KeyCombo klassen, men denne gangen vår ComboHandler klassen vil ikke ha en base klasse.

Hva bør være den første delen av ComboHandler klassen? Vel, vil vi først må oppdage når en tast er trykket. For å gjøre det, må vi legge til en hendelse lytteren til scenen (husk: som foreslått av Actionscript 3 referanse, for å høre globalt for KeyboardEvent hendelsen lyttere, bør de legges til scenen
pakken { import flash.display.Stage, import flash.events.KeyboardEvent; public class ComboHandler {public static funksjonen initialize (stageReference: Stage): void {stageReference.addEventListener (KeyboardEvent.KEY_DOWN, onkeydown);} private static funksjon onkeydown (e: KeyboardEvent ): void {}}}

Denne koden bare bygger grunnstrukturen av ComboHandler klassen Mange flere vil bli lagt til senere merke til at vi bare brukte statiske metoder Det er fordi vi vil bare ha én ComboHandler klasse i vår.!. eksempel. Noen forslag på forbedringer på denne klassen er tilgjengelige i konklusjonen trinn.

Vår ComboHandler klasse må klargjøres gjennom initialize () metode for å få lytteren lagt til scenen. I vår hoved klasse bør vi initial klassen før du arbeider med det. La oss dra til Main.as og gjøre det:
privat funksjon init (e: Hendelses = null): void {removeEventListener (Event.ADDED_TO_STAGE, init); Var i: int; for (i = 0; i < 4; i ++) {keyButtons [i] = nye KeyButton (keys [i]); KeyButton (keyButtons [i]) x = 100 + (100 * i).; KeyButton (keyButtons [i]) y = 50.; addChild (KeyButton (keyButtons [i])); } ComboHandler.initialize (scene);}



Trinn 10: Registrere Combos

Vi har den grunnleggende strukturen i ComboHandler klassen bygget, så nå må vi legge ting til det. Det første er å registrere combos i klassen, så det kan oppdage en combo.

Nå, hvordan skal vi lagre kombinasjoner i denne klassen? Du har kanskje hørt om Dictionary klassen. Denne klassen kan holde noen verdi basert på en nøkkel. I klassen vår, er tastene skal være combo navn, og verdien vil være en matrise, med hver indeks er en nøkkel fra combo. Koden for det (forklart nedenfor):
private Static Var komboer: ordbok; public static funksjonen initialize (stageReference: Stage): void {combos = new ordbok (); stageReference.addEventListener (KeyboardEvent.KEY_DOWN, onkeydown);} public static funksjon registerCombo (comboName: String, comboKeys: Array): Boolean {if (combos [comboName]) {return false; } Komboer [comboName] = comboKeys; return true;}

I linje 1, skaper vi ordlisten som vi snakket om. Linje 5 initialiserer den, og funksjonen registerCombo () registrerer en combo i ordlisten. Denne funksjonen vil returnere true hvis combo ble registrert, eller usant om det var allerede en combo med det navnet i klassen (i så fall må du kanskje fjerne den gamle combo - se trinn 19 for det)
.



Trinn 11: Registrering av et Presset Key og sette opp tidsintervall for

En annen ting som vår klasse skal ha et maksimalt intervall tid mellom hvert tastetrykk. I noen spill som har komboer, har du sannsynligvis lagt merke til at når du trykker på tasten A, for eksempel, må du vente et sekund og trykker på tasten B (forutsatt at det er "AB" combo), vil ingen combo bli oppdaget, fordi du ventet for mye å trykke på B-knappen. Det skjer fordi det er en maksimal intervall tid mellom hvert tastetrykk. Det er akkurat hva vi vil gjøre i vår klasse. Så, i ComboHandler Klasse:
private Static Var pressedKeys: Array, privat statisk konst MAX_INTERVAL: int = 250; //Millisecondsprivate Static Var intervall: int; public static funksjonen initialize (stageReference: Stage): void {combos = new ordbok (); intervall = 0; stageReference.addEventListener (KeyboardEvent.KEY_DOWN, onkeydown);} private static funksjon onkeydown (e: KeyboardEvent): void {if (getTimer () - intervall > MAX_INTERVAL) {pressedKeys = []; } Intervall = getTimer (); pressedKeys.push (e.keyCode);}

I linje 1, skaper vi en rekke kalt pressedKeys. Denne matrisen vil inneholde alle tastene trykkes av brukeren, med intervalltiden mellom to taster blir mindre enn den maksimale intervall.

Lines 3 og 4 definerer en MAX_INTERVAL konstant, noe som vil være vår høyeste intervall, og intervall variabel, som vil hjelpe oss å beregne hva som var intervalltiden mellom to tastetrykk

onkeydown () -funksjonen er nesten ferdig nå. i det, vi først oppdage om intervalltiden mellom dagens tastetrykk og den siste tastetrykk er høyere enn den maksimale intervall. Hvis det er, så vi nullstille vår pressedKeys array, for å slette alle nøkler som var i den. Etter det, oppdaterer vi intervallet variabelen til gjeldende tid (se dokumentasjonen for getTimer () for mer informasjon om hvordan vi beregner intervall) og push () gjeldende nøkkelen til pressedKeys array.



Trinn 12: prøve om en Combo er blitt gjort eller ikke

En siste ting som mangler i vår ComboHandler sin onkeydown () funksjon: evnen til å kontrollere om, etter at en tast er trykket, en combo ble utført av brukeren. Dette er hva vi skal gjøre nå:
privat statisk funksjon onkeydown (e: KeyboardEvent): void {if (getTimer () - intervall > MAX_INTERVAL) {pressedKeys = []; } Intervall = getTimer (); pressedKeys.push (e.keyCode); checkForCombo ();} private static funksjon checkForCombo (): void {var i: int; Var comboFound: String = ""; for (var comboName: String i kombinasjoner) {if (pressedKeys.join ("") .indexOf ((combos [comboName] som Array) .join ("")) > -1) {comboFound = comboName; gå i stykker; }} //Combo Funnet if (comboFound = "") {pressedKeys = []; }}

Linje 12 er den eneste endringen som vi har gjort i vår onkeydown () -funksjonen: ringe checkForCombo () -funksjonen. Dette vil sjekke om en combo er utført eller ikke

Måten vi kontrollere om en combo er utført er veldig interessant. Vi jobber med strenger. Arbeide med strenger, i dette tilfelle gjør det mulig å påvise det som ville ha vært vanskeligere uten å arbeide med dem. For eksempel, tenk om vi hadde en combo med tastene asdf, men pressedKeys utvalg har følgende sekvens av taster: ASFDASDF. Selv om brukeren har trykket de første fire nøkler ("asfd", som ikke
tilsvare en combo) innen fristen, skal dette ikke endre det faktum at brukeren har utført en combo, som antydet med de siste 4 tastene ("asdf"). . Uten strenger, kan vårt arbeid har vært mye lengre

Ideen om å jobbe med strenger er dette: vi sette alle nøklene pressedKeys inne i en streng, skille hver indeks av et mellomrom (derav pressedKeys.join ( "") funksjonskall), så sjekk om det er en spesiell treng inni den. Denne spesielle substring er en streng dannet av nøklene til en combo, også med hver tast atskilt med et mellomrom. Hvis denne delstreng blir funnet, så det betyr at en combo er utført

Du kan teste dette selv med noen kode som dette:.
PressedKeys = ["A", "S", "F" "D", "A", "S", "D", "F"]; checkForCombo ();

... men du vil også være lurt å legge en midlertidig trase (comboFound) samtale i checkForCombo ( ) for å se resultatet.

Innkalling imidlertid at denne metoden ikke vil fungere på alle saker. Det vil ikke fungere om, i stedet for å ha en rekke Strings, hadde vi en rekke objekter, for eksempel. Hvis vi hadde en rekke Object, standard toString () funksjon som kalles når delta () kalles ville skrive "[objekt Object]", og dermed alle våre objekter i matrisen vil være den "samme" i strengen opprettet . Hvis du likevel ønsker å gjøre det, bare overstyre standard toString () funksjon og sette en egendefinert tekst der. I trinn 14 vil vi gjøre det på ComboEvent klassen - ta en titt på det for en referanse

Nå vil vi slutte å fokusere på ComboHandler klasse og jobbe igjen på knappene som vi har skapt. (Ta testen koden du har lagt til.)



Trinn 13: Å gjøre våre Knappene virker på en viktig begivenhet

Foreløpig våre knappene er på skjermen, men de viser oss ingenting . Du husker kanskje at vi opprettet to knappbilder: ett for når knappen ikke trykkes og andre for når den presses. I dette trinnet, vil vi gjøre våre knapper oppføre seg når en tast er trykket. La oss ta turen til vår KeyButton Klasse:
offentlig funksjon onUp (): void {_image.gotoAndStop ("Up");} offentlig funksjon onDown (): void {_image.gotoAndStop ("Down");}

Notice at denne koden bare endrer rammene av knappen image. Vi har fortsatt å ringe dem når den tilsvarende tasten er trykket. Vi vil gjøre det i Main.as:
privat funksjon init (e: Hendelses = null): void {removeEventListener (Event.ADDED_TO_STAGE, init); Var i: int; for (i = 0; i < 4; i ++) {keyButtons [i] = nye KeyButton (keys [i]); KeyButton (keyButtons [i]) x = 100 + (100 * i).; KeyButton (keyButtons [i]) y = 50.; addChild (KeyButton (keyButtons [i])); } ComboHandler.initialize (scene); stage.addEventListener (KeyboardEvent.KEY_DOWN, onkeydown); stage.addEventListener (KeyboardEvent.KEY_UP, onKeyUp);} private funksjon onkeydown (e: KeyboardEvent): void {var i: int; for (i = 0; i < 4; i ++) {if (String.fromCharCode (e.keyCode) == tastene [i]) {KeyButton (keyButtons [i]) onDown (.); gå i stykker; }}} Privat funksjon onKeyUp (e: KeyboardEvent): void {var i: int; for (i = 0; i < 4; i ++) {if (String.fromCharCode (e.keyCode) == tastene [i]) {KeyButton (keyButtons [i]) onUp (.); gå i stykker; }}}

Lines 18 og 19 er de eneste tilskuddene til init () -funksjonen. De legger til flere arrangement lyttere på scenen for å oppdage når en tast er trykket og når en nøkkel har blitt utgitt. Vi vil bruke disse to lytterne til å fortelle våre knappene om de skal være opp eller ned.

Det eneste som du kanskje aldri har sett i onkeydown () og onKeyUp () funksjonene er String.fromCharCode ( ) funksjon. Denne funksjonen returnerer en streng med røye koder som du passerer som argumenter. Siden vi passerer bare én røye kode, som vil funksjonen returnere en streng med bare ett tegn, og om det samsvarer strengene som vi har i nøklene array, det betyr at vi skal fortelle korrespondent knappen for å handle.

Du kan nå teste knappene går opp og ned



Trinn 14: Opprette et tilpasset Combo hendelse

Akkurat nå oppdager vår ComboHandler klasse tastetrykk, håndterer intervaller, bekrefter da kombinasjoner har blitt utført, men det fortsatt ikke handle når en kombo er utført. Hvordan kan den fortelle andre ting som en combo har blitt gjort? Det er det vi vil begynne her. Siden Flash har en veldig sterk hendelse systemet, vil vi sende en hendelse for når en kombo har blitt oppdaget, og la andre gjenstander motta disse hendelsene.

For mer informasjon om egendefinerte hendelser, kan du gå til denne linken på 8bitrocket. Opprett ComboEvent klasse med denne koden på det:
pakke {import flash.events.Event; public class ComboEvent strekker Hendelses {public static konst COMBO_FINISHED: String = "comboFinished"; offentlige Var params: Object; offentlig funksjon ComboEvent (type: String, params: Object, bobler: boolske = false, kansellerbare: Boolean = false) {super (type, bobler, cancelable); this.params = params; } Public override funksjonen klone (): Hendelses {return new ComboEvent (type, this.params, bobler, cancelable); } Public override funksjonen toString (): String {return formatToString ("ComboEvent", "params", "type", "bobler", "kansellerbare"); }}}

I tråd 9 erklærer vi params variabel. Den vil inneholde opplysninger om kombo som er utført (i dette eksempelet vil vi bare sette navnet, men du kan sette hva du vil). Legg merke til den klone () -funksjonen i klassen. Det er opprettet for å tillate redispatched arrangementer for å inneholde samme informasjon til den opprinnelige hendelsen. For mer informasjon om det, kan du besøke dette blogginnlegget på Bit 101



Trinn 15: Dispatching en hendelse når en Combo har blitt gjort

Nå, i vår ComboHandler klasse, er det på tide å handle når en combo er utført. For å gjøre det, må vi sende en ComboEvent. Hendelser kan bare bli sendt ut av objekter som arver fra EventDispatcher, men ComboHandler arver ikke fra EventDispatcher. I stedet for å gjøre det arver fra EventDispatcher (som ville tvinge oss til å ha en forekomst av ComboHandler, som vi ikke ønsker i forbindelse med denne opplæringen), vil vi skape et EventDispatcher objekt i klassen, og gjør dette objektet ekspedere hendelser. I tillegg vil andre klasser lytte til dette objektet for arrangementer. I vår ComboHandler.as filen:

Importer:
import flash.events.EventDispatcher;

Og legge inn denne koden:
public static Var sentralen: EventDispatcher; public static funksjonen initialize (stageReference : Stage): void {combos = new ordbok (); intervall = 0; sentralen = new EventDispatcher (); stageReference.addEventListener (KeyboardEvent.KEY_DOWN, onkeydown);} private static funksjon checkForCombo (): void {var i: int; Var comboFound: String = ""; for (var comboName: String i kombinasjoner) {if (pressedKeys.join ("") .indexOf ((combos [comboName] som Array) .join ("")) > -1) {comboFound = comboName; gå i stykker; }} //Combo Funnet if (comboFound = "") {pressedKeys = []; dispatcher.dispatchEvent (ny ComboEvent (ComboEvent.COMBO_FINISHED, {comboName: comboFound})); }}

I linje 1, erklærer vi vår sentralen objekt. I linje 9, vi initialisere den. I tråd 34, sende vi en ComboEvent. Og det er det for ComboHandler klassen. Nå må vi lytte til arrangementet som blir sendt



Trinn 16:. Kontrollere Til et arrangement i Main

Oppdatering for egendefinerte hendelser er gjort på samme måte som du avtale med noen annen hendelse i AS3: legg en lytter til sentralen og lage en funksjon for å gjøre noe når lytteren får en hendelse. Vår viktigste klasse skal være den som får arrangementet, fordi det vil vise noe på når en combo oppdages skjermen
privat funksjon init. (E: Hendelses = null): void {removeEventListener (Event.ADDED_TO_STAGE, init); Var i: int; for (i = 0; i < 4; i ++) {keyButtons [i] = nye KeyButton (keys [i]); KeyButton (keyButtons [i]) x = 100 + (100 * i).; KeyButton (keyButtons [i]) y = 50.; addChild (KeyButton (keyButtons [i])); } ComboHandler.initialize (scene); stage.addEventListener (KeyboardEvent.KEY_DOWN, onkeydown); stage.addEventListener (KeyboardEvent.KEY_UP, onKeyUp); ComboHandler.dispatcher.addEventListener (ComboEvent.COMBO_FINISHED, onComboComplete);} private funksjon onComboComplete (e: ComboEvent): void {}

Den uthevede linjen er der vi legger lytteren til ComboHandler sin sentralen


Trinn 17: gjøre noe når en Combo har blitt gjort

I denne opplæringen, vil vi bare vise tekst på skjermen med navnet på kombo som ble utført. Vi trenger en tekstfeltet på skjermen og vi trenger å få navnet på kombo som ble utført
privat Div tekstfeltet. Textfield, privat funksjonen init (e: Hendelses = null): void {removeEventListener (Event.ADDED_TO_STAGE , i det); Var i: int; for (i = 0; i < 4; i ++) {keyButtons [i] = nye KeyButton (keys [i]); KeyButton (keyButtons [i]) x = 100 + (100 * i).; KeyButton (keyButtons [i]) y = 50.; addChild (KeyButton (keyButtons [i])); } ComboHandler.initialize (scene); Textfield = new Textfield (); textField.defaultTextFormat = new tekstformat ("Verdana", 20, 0x000000, true); textField.x = 100; textField.y = 200; textField.width = 350; textField.text = "No combo"; addChild (tekstfeltet); stage.addEventListener (KeyboardEvent.KEY_DOWN, onkeydown); stage.addEventListener (KeyboardEvent.KEY_UP, onKeyUp); ComboHandler.dispatcher.addEventListener (ComboEvent.COMBO_FINISHED, onComboComplete);} private funksjon onComboComplete (e: ComboEvent): void {textField.text = e.params.comboName;}

Linje 1 inneholder erklæringen av tekstfeltet som vi skal bruke. Lines 20-27 inneholde initialisering av tekstfeltet. I vår onComboComplete () -funksjonen, vi bare sette combo navn i teksten i tekstfeltet. Det er alt! Nå det eneste igjen å gjøre er å registrere noen kombinasjoner og teste klassen



Trinn 18: Registrere Combos og testing

I Main.as filen, la oss registrere noen kombinasjoner : Jeg vil registrere "AAA Combo", "SSS Combo" og "asdf Combo". Du kan registrere så mange kombinasjoner som du ønsker
privat funksjon init (e: Hendelses = null): void {removeEventListener (Event.ADDED_TO_STAGE, init); Var i: int; for (i = 0; i < 4; i ++) {keyButtons [i] = nye KeyButton (keys [i]); KeyButton (keyButtons [i]) x = 100 + (100 * i).; KeyButton (keyButtons [i]) y = 50.; addChild (KeyButton (keyButtons [i])); } ComboHandler.initialize (scene); 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 tekstformat ("Verdana", 20, 0x000000, true); textField.x = 100; textField.y = 200; textField.width = 350; textField.text = "No combo"; addChild (tekstfeltet); stage.addEventListener (KeyboardEvent.KEY_DOWN, onkeydown); stage.addEventListener (KeyboardEvent.KEY_UP, onKeyUp); ComboHandler.dispatcher.addEventListener (ComboEvent.COMBO_FINISHED, onComboComplete);}

Compile prosjektet og det er hva du får:



Trinn 19: Ta en Combo Fra Combos List

Hva om vi ønsket å fjerne en kombo som er registrert? Følgende funksjon kan legges i ComboHandler.as filen for å nullstille komboer ordboken posisjon til standard. Det vil returnere true hvis combo ble fjernet, og usann hvis det ikke var (det var ikke en combo registrert med det navnet)
public static funksjon removeCombo (comboName: String):. Boolean {if (combos [comboName ]) {combos [comboName] = udefinert; return true; } Return false; }



Konklusjon

Vel, gratulerer for etterbehandling denne opplæringen! Du er klar til å gjennomføre en grunnleggende combo behandleren for spillene dine!

Men en grunnleggende combo handler passer ikke alle spill. Hva om du ønsket å bruke et spill som hadde forskjellige figurer, og hver figur har sine kombinasjoner, og du trenger mer kontroll over handlers? Du kan enkelt gjøre det hvis du tillater oppretting av ComboHandler klasse, som vil forbli som en utfordring for deg.

Du kan også slå den klassen til en Singleton, i stedet for å bare statiske funksjoner. Det er mange andre kreative bruksområder for den, inkludert registrering av ord som en combo og sjekke om noen har skrevet et ord eller ikke.

Hadde du en kreativ bruk for denne klassen? Del det med oss ​​i kommentarfeltet! Anmeldelser