Detectarea combo-urilor cheie, modul simplu

Ați fost vreodată uimit de varietatea de atacuri în lupta împotriva jocurilor precum Mortal Kombat, Super Smash Bros, Soul Calibur și altele? Acum puteți învăța cum să creați un motor pentru a detecta combinațiile cheie și pentru a vă construi propriul joc de lupte!


Rezultatul final al rezultatelor

Să aruncăm o privire asupra rezultatului final pe care îl vom strădui:

Combo-urile din acest demo sunt: asdf, AAA, și SSS. Introduceți-le!


Pasul 1: Introducere

V-ați dorit vreodată să construiți un joc de luptă (sau orice alt gen) cu multe combinații? În acest tutorial vom crea o clasă simplă pentru a detecta combo-urile cheie și a ne spune când un combo a fost făcut de către utilizator. Vom crea, de asemenea, o interfață grafică foarte simplă pentru a ne permite să ne testam clasa.


Pasul 2: Începerea unui nou proiect

Pentru acest tutorial, vom folosi proiectul AS3 FlashDevelop pure cu preloader. Vom crea un proiect cu un preloader numai pentru a vă ușura dacă doriți să continuați să lucrați la rezultatul final spre un joc. Să începem prin deschiderea FlashDevelop și selectarea proiectului nostru:

Cu asta putem începe să lucrăm la cursurile noastre.

Pentru a utiliza grafica pe care o vom crea în Flash Pro în cadrul proiectului AS3, trebuie să exportim imaginile din fișierul .fla într-un format .swc. Mai multe informații despre acest format pot fi găsite în opțiunea 2 a acestui ghid pentru FlashDevelop. Creați un nou ASL FLA în Flash Professional, apoi schimbați setările din fișierul .fla pentru a exporta conținutul acestuia într-un format .swc: accesați Fișier> Publicați setările (sau apăsați Ctrl + Shift + F12) și bifați caseta "Exportă SWC" din fila "Flash".

Dacă nu aveți Flash Professional, nu vă faceți griji. Am inclus fișierul SWC final în pachetul de descărcare pentru acest tutorial. Descărcați-l, apoi treceți la Pasul 6.


Pasul 3: Forma de bază a butonului

Vom crea mai întâi toată partea grafică și vă vom face griji numai cu codul ulterior. Deoarece vom avea de-a face cu combinații cheie, să creăm un buton cu o literă în el pentru a reprezenta o cheie. Butonul nostru va fi foarte simplu: trei cercuri cu culori diferite și unele filtre în el. Așa am construit-o: un cerc mare de culoare gri, cu un cerc alb deasupra ei și un cerc roșu deasupra albului. Apoi, am aplicat o strălucire și două filtre de umbră pe cercul roșu pentru a obține rezultatul final, care este inclus în fișierele sursă.

Pentru mai multe detalii despre cum a fost construit butonul, apuca fișierele sursă pentru acest tutorial!


Pasul 4: Imaginile sus și jos

Acum trebuie să oferim butoanele noastre "în sus" și "în jos". Înainte de a face acest lucru, trebuie să-l transformăm într-un simbol. Să-l convertim la un simbol, să-i dăm un nume KeyButtonImage și exportați-l ca "SWCAssets.KeyButtonImage". Adăugăm SWCAssets pachet în numele clasei în scopuri organizaționale când începem codarea. Acest lucru va fi mai clar mai târziu.

Pe noi KeyButtonImage simbolul, să creăm un alt cadru cheie cu aceeași imagine a primei și apoi să inversăm unghiul filtrelor pe care le folosim în cercul roșu. De asemenea, va trebui să etichetăm cadrele noastre pentru a le identifica în codul nostru, astfel că etichetați primul cadru ca "Sus", iar cel de-al doilea ca "Jos". Imaginea în jos ar trebui să arate astfel:


Pasul 5: Generarea fișierului .swc

Acum, când avem imaginea butonului gata, este timpul să generăm fișierul .swc și să îl adăugăm în proiectul FlashDevelop. Pentru a publica, apăsați Alt + Shit + F12. Veți observa că un fișier .swc a fost creat în același director al fișierului flash. Copiați acest fișier și puneți-l în folderul "lib" al proiectului nostru FlashDevelop. Faceți clic dreapta pe el și selectați "Adăugați în bibliotecă" pentru a face FlashDevelop să recunoască fișierul. Numele fișierului va deveni albastru după ce va fi adăugat la bibliotecă.

FlashDevelop este acum gata să înceapă utilizarea imaginii butonului nostru!


Pasul 6: Clasa KeyButton

Imaginea noastră este gata, așa că trebuie să creați o clasă pentru a ține imaginea și a adăuga funcționalități. În FlashDevelop, adăugați o nouă clasă în folderul src, denumiți-o KeyButton și puneți flash.display.Sprite ca clasă Base.


Pasul 7: Adăugarea imaginii

De la noi KeyButton clasa moșteneste din clasa Sprite, poate adăuga imagini la lista de afișare a copilului. În acest pas vom adăuga imaginea la clasa noastră și vom pune textul în interiorul ei. Să trecem la cod:

 pachet import flash.display.Sprite; import flash.text.TextField; import flash.text.TextFormat; import flash.text.TextFormatAlign; import SWCAssets.KeyButtonImage; clasei publice KeyButton extinde Sprite private var _image: KeyButtonImage; privat var _text: TextField; funcția publică KeyButton (litera: String) _image = new KeyButtonImage (); _image.stop (); addChild (_image); _text = TextField nou (); _text.defaultTextFormat = TextFormat nou ("Verdana", 28, 0xFFFFFF, true, null, null, null, null, TextFormatAlign.CENTER); _text.text = litera; _text.height = 38; _text.x = - (_ text.width / 2); _text.y = - (text.height / 2); _text.mouseEnabled = false; addChild (_text); 

În liniile 11 și 13, vom declara variabile care vor păstra imaginea butonului nostru, respectiv textul literei. În constructorul clasei noastre (linia 15) cerem un șir, care va fi litera pe care butonul nostru o va reprezenta.

De la noi KeyButtonImage are două cadre, pe linia 18 numim Stop() metodă pentru al împiedica să se răsucească prin ele. Vom defini momente specifice pentru ca imaginea să se schimbe mai târziu. Linia 20 adaugă imaginea în lista de copii a butonului.

De la linia 22 la linia 30, creăm câmpul de text care conține o literă, poziționează-o și o dezactivează de la evenimentele mouse-ului (nu este necesar, dar este bine să faci dacă câmpul de text nu trebuie să facă decât să afișeze textul). Linia 32 adaugă textul pe lista de copii a butonului.


Pasul 8: Crearea obiectelor de imagine

Al nostru KeyButton clasa poate afișa deja o imagine și reprezintă o literă, astfel că în acest pas vom adăuga câteva butoane pe ecran. Deoarece construim doar un exemplu pentru a testa clasa noastră, nu vom adăuga toate literele din exemplul respectiv. În schimb, vom lucra doar cu 4 litere (dar clasa noastră va fi capabilă să detecteze combinații cu orice chei!): A, S, D și F. Vom adăuga pe ecranul nostru acum:

 cheia private varButtons: Array = []; taste private var: Array = ["A", "S", "D", "F"]; funcția privată init (e: Event = null): void removeEventListener (Event.ADDED_TO_STAGE, init); var i: int; pentru (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]));  

Linia 1 creează o matrice pentru a conține toate butoanele din ecranul nostru. Acest lucru va fi foarte util mai târziu, deoarece ne va permite să bucle prin matrice în loc de a verifica butonul cu buton. Linia 2 definește numai cu ce chei vom lucra (așa cum sa spus, A, S, D și F). Linile 12-16 se află într-o buclă care va crea cele 4 butoane și le va poziționa pe ecran.

Acum puteți compila proiectul și puteți vedea butoanele de pe ecran:


Pasul 9: Crearea clasei ComboHandler

Suntem gata acum să începem să lucrăm la detectarea combo-urilor. Pentru asta, vom crea o ComboHandler clasă. Urmați aceiași pași pe care ați făcut-o pentru a crea KeyCombo clasa, dar de data asta ComboHandler clasa nu va avea o clasă de bază.

Care ar trebui să fie prima parte din ComboHandler clasă? Ei bine, va trebui mai întâi să detectăm când a fost apăsată o cheie. Pentru a face acest lucru, trebuie să adăugăm pe scenă un ascultător al evenimentului (rețineți: așa cum este sugerat de referința ActionScript 3, pentru a asculta la nivel global pentru KeyboardEvent ascultători de evenimente, aceștia ar trebui să fie adăugați pe scenă!

 pachet import flash.display.Stage; import flash.events.KeyboardEvent; clasa publică ComboHandler funcția publică statică inițializată (stageReference: Stage): void stageReference.addEventListener (KeyboardEvent.KEY_DOWN, onKeyDown);  funcția statică privată onKeyDown (e: KeyboardEvent): void 

Acest cod construiește doar structura de bază a ComboHandler clasă. Mai multe vor fi adăugate mai târziu! Observați că am folosit metode numai statice. Asta pentru că nu vom avea decât unul ComboHandler clasă în exemplul nostru. Unele sugestii privind îmbunătățirile din această clasă sunt disponibile în etapa de încheiere.

Al nostru ComboHandler clasa trebuie să fie inițializată prin inițializa () pentru ca ascultătorul să fie adăugat la scenă. În a noastră Principal ar trebui să inițializăm clasa înainte de a lucra cu ea. Să mergem la Main.as și să facem asta:

 funcția privată init (e: Event = null): void removeEventListener (Event.ADDED_TO_STAGE, init); var i: int; pentru (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); 

Pasul 10: Înregistrarea combo-urilor

Avem structura de bază a ComboHandler clasa construită, deci acum trebuie să adăugăm lucruri la ea. Primul lucru este să înregistrați combo-uri în clasă, astfel încât să poată detecta un combo.

Acum, cum vom păstra combo-urile în această clasă? Este posibil să fi auzit de clasa Dicționar. Această clasă poate deține orice valoare bazată pe o cheie. În clasa noastră, cheile vor fi numele combo, iar valoarea va fi o matrice, fiecare index fiind o cheie din combo. Codul pentru aceasta (explicat mai jos):

 private static var combos: Dicționar; funcția statică publică inițializată (stageReference: Stage): void combos = new Dictionary (); stageReference.addEventListener (KeyboardEvent.KEY_DOWN, onKeyDown);  registru funcțional static publicCombo (comboName: String, comboKeys: Array): Boolean if (combos [comboName]) return false;  combo-uri [comboName] = comboKeys; return true; 

În linia 1, vom crea dicționarul despre care am vorbit. Linia 5 o inițializează, iar funcția registerCombo () înregistrează un combo în dicționar. Această funcție va reveni Adevărat dacă combo-ul a fost înregistrat cu succes, sau fals dacă există deja un combo cu acest nume în clasă (caz în care este posibil să fie necesar să eliminați combo-ul vechi - a se vedea pasul 19 pentru asta!).


Pasul 11: Înregistrarea unei taste presetate și setarea intervalului de timp

Un alt lucru pe care clasa noastră ar trebui să îl aibă este un interval de timp maxim între fiecare presă cheie. În unele jocuri care au combo-uri, ați observat probabil că atunci când apăsați tasta A, de exemplu, așteptați o secundă și apăsați tasta B (presupunând că există combinația "AB"), nu va fi detectată combo, pentru că ați așteptat prea mult pentru a apăsa tasta B. Aceasta se întâmplă deoarece există un interval de timp maxim între fiecare apăsare de taste. Exact asta vom face în clasa noastră. Deci, în ComboHandler clasă:

 private static var pressedKeys: Array; static static const MAX_INTERVAL: int = 250; // Intervalul static privat din intervalul milisecunde: int; funcția statică publică inițializată (stageReference: Stage): void combos = new Dictionary (); interval = 0; stageReference.addEventListener (KeyboardEvent.KEY_DOWN, onKeyDown);  funcția statică privată onKeyDown (e: KeyboardEvent): void if (getTimer () - interval> MAX_INTERVAL) presedKeys = [];  interval = getTimer (); pressedKeys.push (e.keyCode); 

În linia 1, creăm un tabel numit pressedKeys. Această matrice va conține toate tastele apăsate de utilizator, intervalul dintre două taste fiind mai mic decât intervalul maxim.

Liniile 3 și 4 definesc a MAX_INTERVAL constantă, care va fi intervalul nostru maxim, și interval variabilă, ceea ce ne va ajuta să calculam intervalul dintre două prese cheie.

onkeydown () funcția este aproape finalizată acum: în ea, vom detecta mai întâi dacă intervalul dintre apăsarea curentă a tastei și cea mai recentă apăsare a tastei este mai mare decât intervalul maxim. Dacă este, atunci ne reinițializăm pressedKeys array, pentru a șterge toate cheile care au fost în el. După aceea, actualizăm variabila intervalului la ora curentă (consultați documentația getTimer () pentru mai multe detalii despre modul de calcul al intervalului) și Apăsați() cheia curentă la pressedKeys mulțime.


Pasul 12: Verificarea dacă un Combo a fost făcut sau nu

Un ultim lucru lipsește în nostru ComboHandler„s onkeydown () funcție: capacitatea de a verifica dacă, după ce o tastă a fost apăsată, a fost efectuată o combo de către utilizator. Așa vom face acum:

 funcția statică privată onKeyDown (e: KeyboardEvent): void if (getTimer () - interval> MAX_INTERVAL) presedKeys = [];  interval = getTimer (); pressedKeys.push (e.keyCode); checkForCombo ();  funcția statică privată checkForCombo (): void var i: int; var comboFound: String = ""; pentru (var comboName: String în combinații) if (pressedKeys.join ("") .indexOf ((combos [comboName] ca array) .join (""))> -1) comboFound = comboName; pauză;  // Combo S-a găsit dacă (comboFound! = "") PressedKeys = []; 

Linia 12 este singura schimbare pe care am făcut-o în noi onkeydown () funcție: apelați checkForCombo () funcţie. Acest lucru va verifica dacă un combo a fost executat sau nu.

Modul în care verificăm dacă a fost efectuat un combo este foarte interesant: lucrăm cu șiruri de caractere. Lucrul cu șiruri de caractere, în acest caz, ne permite să detectăm lucruri care ar fi fost mai greu, fără a lucra cu ele. De exemplu, imaginați-vă dacă am avut un combo cu tastele ASDF, dar cu pressedKeys array are următoarea secvență de chei: ASFDASDF. Chiar dacă utilizatorul a apăsat primele patru taste ("ASFD", care nu face corespunde unei combo-uri) în limita de timp, aceasta nu trebuie să schimbe faptul că utilizatorul a efectuat un combo, după cum indică ultimele 4 taste ("ASDF"). Fără corzi, munca noastră ar fi putut fi mult mai lungă.

Ideea de a lucra cu șiruri de caractere este următoarea: am pus toate cheile înăuntru pressedKeys în interiorul unui șir, separând fiecare index de un spațiu (prin urmare, presedKeys.join ("") funcția de apel), apoi verificați dacă există un substring special în interiorul acestuia. Această subcrasă este un șir format din cheile unui combo, de asemenea, cu fiecare cheie separată de un spațiu. Dacă se găsește acest substring, înseamnă că a fost efectuat un combo.

Puteți testa acest lucru singur cu un cod ca acesta:

 pressedKeys = ["A", "S", "F", "D", "A", "S", "D", "F"]; checkForCombo ();

? deși veți dori, de asemenea, să adăugați o perioadă temporară trace (comboFound) sună checkForCombo () pentru a vedea rezultatul.

Observați, totuși, că această metodă nu va funcționa în toate cazurile. Nu va funcționa dacă, în loc să avem o serie de șiruri, am avut, de exemplu, o serie de obiecte. Dacă am avea o matrice de Obiect, funcția implicită toString (), care se numește atunci când se numește join (), va tipări "[object Object]" și astfel toate obiectele din matrice ar fi "același" în șirul creat . Dacă doriți să faceți acest lucru, pur și simplu înlocuiți funcția implicită toString () și puneți acolo un text personalizat. În pasul 14 vom face acest lucru în clasa ComboEvent - aruncăm o privire la el pentru o referință!

Acum, vom înceta să ne concentrăm pe ComboHandler clasa și să lucreze din nou pe butoanele pe care le-am creat. (Scoateți codul de testare pe care tocmai l-ați adăugat.)


Pasul 13: Faceți clic pe butoanele noastre pentru un eveniment cheie

În prezent, butoanele noastre sunt pe ecran, dar nu ne arată nimic. S-ar putea să vă amintiți că am creat două imagini ale butoanelor: una pentru când butonul nu este apăsat și altul pentru când este apăsat. În acest pas, vom face ca butoanele noastre să se comporte când o tastă a fost apăsată. Să mergem la noi KeyButton clasă:

 funcția publică onUp (): void _image.gotoAndStop ("Sus");  funcția publică onDown (): void _image.gotoAndStop ("Down"); 

Rețineți că acest cod modifică numai cadrele imaginii butonului. Trebuie să îi sunăm încă atunci când tasta corespunzătoare a fost apăsată. Vom face asta în Main.as:

 funcția privată init (e: Event = null): void removeEventListener (Event.ADDED_TO_STAGE, init); var i: int; pentru (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;   

Linii 18 și 19 sunt singurele adăugiri la init () funcţie. Ele adaugă mai mulți ascultători de evenimente pe scenă pentru a detecta când a fost apăsată o tastă și când a fost lansată o cheie. Vom folosi acești doi ascultători pentru a le spune butoanelor noastre dacă ar trebui să fie în sus sau în jos.

Singurul lucru pe care probabil că nu l-ați văzut niciodată în onkeydown () și onkeyup () este funcția String.fromCharCode () funcţie. Această funcție returnează un șir cu codurile de caractere pe care le transmiteți ca argumente. Din moment ce trecem doar un singur cod char, acea funcție va returna un șir cu un singur caracter și dacă se potrivește cu șirurile pe care le avem în matricea cheilor, înseamnă că ar trebui să spunem butonul corespondentului să acționeze.

Acum puteți testa butoanele care merg în sus și în jos!


Pasul 14: Crearea unui eveniment Combo personalizat

Chiar acum, ale noastre ComboHandler clasa detecteaza apasarea tastelor, manevreaza intervalele de timp, verifica cand au fost executate combo-uri, dar inca nu actioneaza cand a fost efectuata combo-ul. Cum poate spune alte lucruri că a fost făcut un combo? Asta vom începe aici. Deoarece sistemul Flash are un sistem de evenimente foarte puternic, vom trimite un eveniment pentru momentul în care a fost detectat un combo și să permită altor obiecte să primească aceste evenimente.

Pentru mai multe informații despre evenimentele personalizate, accesați acest link pe 8bitrocket. Creați ComboEvent clasa cu acest cod în ea:

 pachet import flash.events.Event; clasa publică ComboEvent extinde evenimentul static public const COMBO_FINISHED: String = "comboFinished"; public var params: obiect; funcția publică ComboEvent (tip: String, params: Object, bubbles: Boolean = false, cancelable: Boolean = false) super (tip, bule, anulat); this.params = params;  clona () pentru funcția de suprascriere publică:: Eveniment returnează noul ComboEvent (tip, this.params, bubbles, cancellable);  funcția de suprascriere publică toString (): String retur formatToString ("ComboEvent", "params", "type", "bubbles", "cancellable"); 

În linia 9 declarăm params variabil. Acesta va conține informații despre combo-ul care a fost efectuat (în acest exemplu vom pune doar numele, dar puteți pune orice vreți). Observați clona () funcția în clasă. Acesta este creat pentru a permite evenimentelor redistribuite să conțină aceleași informații ale evenimentului original. Pentru mai multe informații despre el, vizitați acest post blog pe Bit 101


Pasul 15: Dispecerarea unui eveniment ori de câte ori a fost efectuat un Combo

Acum, în nostru ComboHandler clasa, este timpul să acționăm atunci când a fost efectuată o combo. Pentru a face acest lucru, trebuie să trimitem a ComboEvent. Evenimentele pot fi expediate numai de obiectele care au moștenire EventDispatcher, dar ComboHandler nu moștenesc de la EventDispatcher. În loc de a face din moștenire EventDispatcher (care ne-ar forța să avem un exemplu de ComboHandler, care nu vrem în scopul acestui tutorial), vom crea un EventDispatcher obiect din clasă și să facă acest lucru expedierea evenimentelor. În plus, alte clase vor asculta acest obiect pentru evenimente. În fișierul nostru ComboHandler.as:

Importați acest lucru:

 import flash.events.EventDispatcher;

Și adăugați acest cod:

 public static var dispatcher: EventDispatcher; funcția statică publică inițializată (stageReference: Stage): void combos = new Dictionary (); interval = 0; dispecer = nou EventDispatcher (); stageReference.addEventListener (KeyboardEvent.KEY_DOWN, onKeyDown);  funcția statică privată checkForCombo (): void var i: int; var comboFound: String = ""; pentru (var comboName: String în combinații) if (pressedKeys.join ("") .indexOf ((combos [comboName] ca array) .join (""))> -1) comboFound = comboName; pauză;  // Combo S-a găsit dacă (comboFound! = "") PressedKeys = []; dispatcher.dispatchEvent (noul ComboEvent (ComboEvent.COMBO_FINISHED, comboName: comboFound)); 

În linia 1, declarăm obiectul dispeceratului nostru. În linia 9, o inițializăm. În linia 34, trimitem a ComboEvent. Și asta este pentru ComboHandler clasă. Acum trebuie să ascultăm evenimentul care este expediat.


Pasul 16: Verificarea unui eveniment în principal

Verificarea evenimentelor personalizate se face în același mod în care vă ocupați cu orice alt eveniment din AS3: adăugați un ascultător dispecerului și creați o funcție de a face ceva când ascultătorul primește un eveniment. Al nostru Principal clasa ar trebui să fie cea care primește evenimentul, deoarece va afișa ceva pe ecran atunci când este detectat un combo.

 funcția privată init (e: Event = null): void removeEventListener (Event.ADDED_TO_STAGE, init); var i: int; pentru (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  

Linia evidențiată este locul în care adăugăm ascultătorului ComboHandler„s dispecer.


Pasul 17: Faceți ceva când a fost făcut un combo

În acest tutorial, vom afișa doar text pe ecran cu numele combo-ului care a fost efectuat. Vom avea nevoie de un câmp de text pe ecran și va trebui să obținem numele combo-ului care a fost executat.

 privat var textField: TextField; funcția privată init (e: Event = null): void removeEventListener (Event.ADDED_TO_STAGE, init); var i: int; pentru (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; 

Linia 1 conține declarația câmpului de text pe care îl vom folosi. Liniile 20-27 conțin inițializarea câmpului de text. În a noastră onComboComplete () funcția, punem doar numele combo-ului în textul câmpului de text. Asta e! Acum, singurul lucru de făcut este să înregistrați combinații și să testați clasa!


Pasul 18: Înregistrarea combo-urilor și testarea

În fișierul Main.as, să înregistrăm câteva combinații: voi înregistra "AAA Combo", "SSS Combo" și "ASDF Combo". Puteți înregistra cât mai multe combinații pe măsură ce doriți!

 funcția privată init (e: Event = null): void removeEventListener (Event.ADDED_TO_STAGE, init); var i: int; pentru (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); 

Compilați proiectul și asta obțineți:


Pasul 19: Eliminarea unui combo din lista combinate

Dacă am vrea să eliminăm un combo care a fost înregistrat? Următoarea funcție poate fi adăugată în fișierul ComboHandler.as pentru a reseta poziția dicționarului combo-urilor la valoarea implicită. Se va întoarce adevărat dacă combo-ul a fost eliminat și fals dacă nu ar fi fost (nu a fost înregistrat combo cu acel nume).

 funcția statică publică removeCombo (comboName: String): boolean if (combos [comboName]) combos [comboName] = undefined; return true;  return false; 

Concluzie

Felicitări pentru finalizarea acestui tutorial! Sunteți gata să implementați un handler combo de bază pentru jocurile dvs.!

Cu toate acestea, un handler combo de bază nu se potrivește tuturor jocurilor. Dacă ați vrea să folosiți un joc care avea caractere diferite și fiecare personaj avea combo-urile și aveați nevoie de mai mult control asupra manipulatorilor? Puteți face acest lucru cu ușurință dacă permiteți instanțierea ComboHandler clasa, care va rămâne o provocare pentru dvs..

Ați putea transforma acea clasă într-un Singleton, în loc să aveți doar funcții statice. Există multe alte utilizări creative, inclusiv înregistrarea cuvintelor ca combinație și verificarea dacă cineva a scris un cuvânt sau nu.

Ați folosit creativ această clasă? Împărtășește-ne cu noi în secțiunea de comentarii!

Cod