Acum suntem la jumătatea acestei serii și până acum am acoperit foarte mult. În tutorialul anterior, am adăugat un sistem de puncte la jocul nostru, am aplicat în cele din urmă "gravitatea" blocurilor și am îmbunătățit sistemul nostru de potrivire. În acest tutorial vom face câteva îmbunătățiri minore ale sistemului nostru de swapping, vom adăuga textul cu puncte plutitoare pe care îl puteți vedea în versiunea finală a jocului și vom termina sistemul nostru de potrivire o dată pentru totdeauna.
Iată o demonstrație a jocului pe care lucrăm în această serie:
Chiar acum, jocul are un mecanism de schimbare foarte simplu implementat. În timp ce sistemul pe care îl folosim pentru a efectua aceste swap-uri este foarte eficient, există două probleme pe care le puteți întâlni în timpul jocului și amândouă ar trebui să fie reparate înainte de a merge mai departe.
Aceste probleme provin din aceeași idee: faptul că sistemul de swap nu ia în considerare frontierele câmpului de joc.
Ce înseamnă asta exact? Ei bine, mai întâi, dacă ați fi vrut, ați putea muta un bloc în afara câmpului de joc la stânga sau la dreapta, făcând o schimbare ca cea ilustrată mai jos:
Dacă intrați în joc și faceți acest lucru, veți vedea că jocul nu face nimic pentru a vă opri și se comportă ca și cum câmpul de joc continuă pentru totdeauna într-o direcție orizontală. Motivul pentru aceasta este că, chiar acum, câmpul de joc face continuă pentru totdeauna orizontal.
Deoarece nu am definit niciodată unde sunt marginile stânga și dreapta ale câmpului de joc sau chiar că câmpul de joc are stânga și marginea dreaptă, jocul nu încearcă niciodată să oprească jucătorul să nu mai miște blocul în lateral. Această problemă apare și atunci când schimbați și cealaltă margine a câmpului de joc.
Pentru a rezolva această problemă, vom adăuga câteva condiții noi Blocare> Pe drop DragDrop
Eveniment. Mergeți la acest eveniment și adăugați această condiție la Sub-Evenimentul care verifică swap-urile stângi:
Stare: LeftBlock> Comparație X Comparație = Mare sau egal X = SPAWNX
Acum adăugați această condiție la sub-eveniment care verifică swap-urile potrivite:
Stare: Bara dreapta> Comparație X Comparație = Mai puțin sau egal X = SPAWNX + Block.Width * 8
Evenimentele dvs. de schimbare stânga și dreapta ar trebui să arate astfel:
Aceste condiții noi pe care le-am adăugat sunt folosite de evenimentele de schimb ca o verificare pentru a se asigura că swap-ul se află în limitele orizontale ale câmpului de joc. Primul asigură că poziția în care blocul va fi schimbat nu este mai departe spre stânga decât cele mai stânga Blocuri, iar cel de-al doilea asigură faptul că poziția în care blocul este schimbat nu este mai departe spre dreapta decât cel din dreapta - cele mai multe blocuri.
Cu al doilea, am folosit o formulă cu Block.Width
pentru a afla unde sunt cele mai potrivite blocuri pentru a se asigura că, dacă dimensiunea blocurilor s-ar schimba, nu ar împiedica funcționarea acestei condiții.
Dacă executați jocul, nu mai trebuie să faceți schimburi orizontale care ar pune blocuri în afara zonei de joc.
Cealaltă problemă este că jocul nu vă oprește să schimbați un bloc sub câmpul de joc. Deschideți jocul și încercați să faceți o schimbare ca cea pe care o ilustrez în această imagine:
După ce ați făcut această schimbare, ar fi trebuit să văd că blocul a dispărut în esență doar în spatele piesei de jos a câmpului de joc, iar blocurile care erau deasupra lui ar fi trebuit să scadă pentru a umple spațiul gol acum. Din nou, această problemă se datorează faptului că nu am definit niciodată unde este marginea inferioară a câmpului.
În tutorialul anterior am afirmat că blocurile ar trebui să nu mai cadă după ce au atins o anumită înălțime, dar nu am spus nici dacă a fost bine ca un bloc să meargă sub această înălțime atunci când efectuați un schimb.
Fixarea acestui lucru va fi la fel de simplă ca cele două probleme anterioare. Mergeți la Sub-eveniment care verifică swap-urile în jos și adăugați această condiție:
Stare: BottomBlock> Comparație Y Comparison = Mai mic sau egal Y = SPAWNY
Codul pentru această secțiune ar trebui să arate astfel:
La fel ca și condiția anterioară, acest lucru asigură că swap-ul nu ar plasa blocul într-o zonă în afara câmpului de joc. În acest caz, se uită la zona de sub câmpul de joc.
Dacă vă testați jocul în acest moment, acum nu ar trebui să faceți swap-uri care au pus blocul sub baza câmpului de joc.
În acest moment, am rezolvat problemele cu sistemul de swapping și putem trece mai mult la îmbunătățirea sistemului nostru de puncte.
În acest moment sistemul nostru de puncte este destul de eficient. Funcționează așa cum am intenționat și afișează deja totul corect. Cu toate acestea, dacă ați dat jocul unui jucător și l-ați așezat cu el, s-ar putea să nu poată spune exact câte puncte au obținut din fiecare grup pe care l-au făcut, deoarece jocul se poate mișca rapid.
Pentru a rezolva această problemă, vom adăuga ferestre pop-up text care afișează câte puncte face jucătorul din grupurile pe care le formează. Acest lucru va aduce un plus de fler vizual jocului și va clarifica jucătorului cât de valoroase pot fi grupurile mai mari.
Înainte de a putea începe să adăugăm funcționalitatea, trebuie să creați un obiect nou care va acționa ca o fereastră pop-up a textului, deci urmați acești pași.
FloatingPointsText
Câmp de joc
616, 250
127, 43
0
Calibri, Bold, 24
255, 255, 255
1.25
.Obiectul pe care tocmai l-am creat va fi folosit pentru a crea textul plutitor care îi spune jucatorului câte puncte îi va da un anumit grup. Acum, când avem acest obiect, trebuie să îl implementăm astfel încât atunci când jucătorul face o potrivire, acesta va da naștere unei noi instanțe a obiectului și va schimba textul pentru a afișa numărul corespunzător de puncte.
Pentru a da naștere la textul de puncte, vom adăuga două noi acțiuni la NumMatchesFound verificări în FindMatches funcţie.
Mergeți la FindMatches și adăugați aceste două acțiuni la sfârșitul fiecărei acțiuni NumMatchesFound> 3 Verifica:
Acțiune: Sistem> Crearea obiectului Object = FloatingPointsText Layer = 2 X = Block.X - Block.Width / 2 Y = Block.Y - Block.Width / 2 Acțiune: FloatingPointsText> Set Text Text = NumMatchesFound * 10
Ta FindMatches funcția ar trebui să pară acum:
Deci, ce fac aceste acțiuni? Prima acțiune creează FloatingPointsText
obiect în partea de sus a primului bloc din grup și al doilea multiplică numărul de blocuri din grup cu 10, la fel ca formula noastră de puncte și stabilește textul noului obiect la acel număr.
Dacă executați jocul în acest moment, ar trebui să observați că textul nu se mișcă deloc. Pentru a rezolva această problemă, vom adăuga un nou eveniment la jocul nostru.
Intoarce-te la Fișa evenimentului 1 și adăugați un nou eveniment:
Stare: Sistem> Fiecare actiune: FloatingPointsText> Mutare la unghi Angle = -90 Distanta = 0.25
Noul dvs. eveniment ar trebui să arate astfel:
Dacă rulați acum jocul, veți vedea că textul se mișcă.
În acest moment, a noastră FloatingPointsText funcționează așa cum vrem, dar ați observat o problemă ușoară acum că sistemul este în vigoare. Problema în sine provine din modul în care funcționează sistemul de potrivire și acum că putem observa că există încă o problemă de potrivire, putem să stabilim rezolvarea acestei probleme finale și punerea sistemului nostru de potrivire în pat.
Dacă nu știți încă despre ce este vorba, intrați în joc și faceți un grup care conține patru blocuri. Odată ce grupul dvs. este făcut, ar trebui să vedeți ceva similar cu ceea ce am în imaginea de mai jos:
După cum puteți vedea, de fapt avem Două instanțe ale obiectelor text plutitoare. Dacă faceți un grup cu cinci Blocuri, problema se agravează și veți vedea de fapt trei exemple de text de puncte.
Motivul pentru această problemă se bazează pe modul în care sunt detectate potrivirile. În acest moment, sistemul nostru de potrivire se uită la fiecare bloc individual și arată în direcția cea dreaptă și direcția descendentă pentru a găsi meciuri. Din acest motiv, sistemul de potrivire găsește de fapt trei grupuri de dimensiuni diferite, chiar dacă este de fapt un singur grup mare.
Primul grup va fi găsit când începe cu blocul A și va conține cinci blocuri:
Cel de-al doilea grup se va găsi când începe cu blocul B și va conține patru blocuri:
Și al treilea grup va fi găsit când începe cu blocul C și va conține trei blocuri:
Deci, chiar acum, sistemul nostru de potrivire este foarte ineficient - și rupt - deoarece verifică aceleași blocuri de mai multe ori și înregistrează mai multe grupuri decât există de fapt.
Remedierea acestei probleme este de fapt mult mai simplă decât ar părea la început.
Problema de aici provine în primul rând din faptul că sistemul de potrivire nu are cum să știe dacă blocul de la care începe cu acesta este de fapt începutul grupului. Dacă am putea garanta că ne-am uitat doar la Blocurile care erau cele mai îndepărtate la dreapta sau cele mai înalte, în cadrul grupurilor cărora le aparțineau, atunci sistemul de potrivire ar fi eficace așa cum este.
Deci, tot ce trebuie să facem este să adăugăm o condiție sau un Eveniment care să asigure că nu există blocuri de potrivire deasupra sau în stânga blocului de la care începem și să spunem funcția când a efectuat această verificare, procedați în mod normal dacă blocul la care se uită este începutul grupului.
Primul lucru pe care îl vom adăuga este un nou parametru pentru CheckMatches
funcţie. Acest parametru va fi un număr întreg și va fi și el 1
sau 0
.
Dacă parametrul este 1
, aceasta va indica funcției pe care trebuie să o efectueze pentru a verifica dacă se uită la blocul inițial din grup; dacă este 0
, va indica funcția pe care o are deja a efectuat această verificare și poate proceda în mod normal pentru a determina dacă grupul este compus din trei sau mai multe blocuri.
Deci, începeți prin a merge la FindMatches
funcţie. În această funcție sunați CheckMatches
de două ori. Deoarece aceasta este prima dată când sunați CheckMatches
pentru orice bloc pe care îl căutați, trebuie să adăugați un nou parametru la fiecare dintre aceste apeluri de funcții și să-l setați 1
astfel încât să verifice dacă blocul la care se uită este începutul unui grup.
Ta FindMatches
funcția ar trebui să pară acum, și am subliniat cele două afirmații schimbate pentru confortul dvs.:
Acum spunem asta CheckMatches
când trebuie să efectueze acest nou control, trebuie să adăugăm efectiv noua verificare pentru ca acesta să efectueze. Du-te la tine CheckMatches
și adăugați acest nou Sub-Eveniment ca prim Sub-Eveniment:
Eveniment: Block> Comparare X Comaprison = Egal cu X = Function.Param (0) - ((Block.Width + 2) * Function.Param (3) (1) - ((Block.Width + 2) * Function.Param (4)) Stare: Functie> Comparati parametrul Index = 5 Comparatie = Egal cu Valoare = 1
Înainte de a termina modificarea CheckMatches
trebuie să adăugați o declarație Else în partea de sus a evenimentului inițial pentru CheckMatches
și trebuie să adăugați noul parametru la CheckMatches
apel și setați-l la 0
.
Noul cod pentru funcția CheckMatches ar trebui să arate astfel:
Evenimentul pe care l-am adăugat face exact ceea ce am descris mai sus. Mai întâi, se uită la blocul de mai sus sau la stânga blocului inițial pe care îl introduceți.
Dacă acel bloc are aceeași culoare ca cel pe care l-ați trecut, nu face nimic, deoarece știe că blocul în care ați trecut nu este primul Bloc din acel grup.
Pe de altă parte, dacă este nu aceeași culoare ca blocul în care ați trecut, verificarea inițială apare din cauza instrucțiunii Else pe care tocmai am adăugat-o și caută un grup de trei sau mai multe blocuri așa cum ar fi în mod normal.
Dacă testați jocul în acest moment și creați un grup cu mai mult de trei blocuri, ar trebui să vedeți numai un obiect text plutitor care vă spune câte puncte a meritat grupul.
Acum că am terminat de rezolvat toate aceste caracteristici și am finalizat în cele din urmă sistemul nostru de potrivire, suntem pregătiți să implementăm sistemul de mișcare. Din moment ce am făcut deja multe în acest tutorial și din moment ce sistemul de mișcare ne cere să realizăm mai multe sisteme complexe, voi aștepta până la următorul articol să pornească sistemul de mișcare.
Dacă sunteți nerăbdător să începeți să lucrați la ea, luați în considerare câteva din aceste lucruri. Evident, primul lucru pe care trebuie să-l faceți este implementarea mișcării în sine. Pentru aceasta, încercați să utilizați un sistem similar cu cel folosit atunci când facem obiectele text de puncte să plutească. De acolo, începeți să vă gândiți cum ați schimba viteza cu care se mișcă. În cele din urmă, cum veți genera noi rânduri de Blocuri pentru jucător și cum veți ști cand pentru a genera noi rânduri?
Luați ceva timp să vă gândiți la aceste lucruri și vă voi vedea aici săptămâna viitoare pentru următoarea mare tranșă a seriei.