Faceți un joc Match-3 în Construct 2 Chaining și jocul Overs

A sosit timpul: ne apropiem de jocul nostru și suntem gata să punem în aplicare mecanismul final de joc. Acest articol se va concentra pe realizarea unui sistem combo care oferă jucătorului mai multe puncte pentru crearea de lanțuri care distrug mai multe grupuri de blocuri după o singură schimbare.

În plus, vom implementa scenariul de pierdere și vom adăuga un ecran de joc peste. În cele din urmă, voi vorbi despre lucruri în care poți să lucrezi în timpul tău, pentru a îmbunătăți și a extinde jocul dincolo de ceea ce ne-am ocupat. Deci, fără să mai vorbim, să începem ...


Joc final Demo

Iată un demo al jocului la care ne-am străduit și pe care l-am construit la sfârșitul acestei părți a seriei:




Gasirea meciurilor

Înainte de a trece la articolul principal, vreau să fac o mică schimbare atunci când FindMatches este sunat.

În timp ce lucram la acest articol, am descoperit o problemă pe care o puteți vedea în GIF de mai jos:

După cum puteți vedea în acest prim GIF, când un bloc este abandonat la o distanță de numai un bloc pentru a încerca să formeze un meci cu un grup de blocuri în partea de jos a căderii, acesta funcționează perfect.

În acest al doilea GIF, devine clar că atunci când un bloc este abandonat cu o distanță mai mare în același scenariu, acesta nu reușește să detecteze meciul până când nu efectuăm o altă schimbare. Motivul pentru aceasta este că jocul nu caută potriviri destul de des.

Chiar acum, jocul caută doar meciuri după o schimbare, dar din cauza timpului în care este nevoie de un bloc pentru a cădea această distanță, detectarea meciului sa încheiat deja când blocul atinge pământul și astfel meciul nu a fost găsit până acesta este reinițializat.

Pentru a rezolva acest lucru, vom modifica atunci când vom efectua o FindMatches Verifica.

Mai întâi du-te la SwapBlocks și elimină evenimentul final din funcție, astfel încât acesta să nu sune FindMatches deloc.

SwapBlocks ar trebui să arate așa:

În acest moment, nu există nicio chemare la eveniment FindMatches. Vom remedia acest lucru prin adăugarea unei noi acțiuni la eveniment, care va detecta momentul în care sunt posibile meciurile. Găsiți acest eveniment și adăugați această acțiune la sfârșitul evenimentului Else:

Acțiune: Funcție> Funcție apel Nume = "FindMatches"

Evenimentul dvs. ar trebui să arate astfel:

De asemenea, utilizați această șansă pentru a muta ambele MatchesPossible Evenimente la sfârșitul codului de joc, dacă nu ați făcut-o deja. Făcând acest lucru se va asigura că nu sunt chemați deloc înaintea codului care elimină potrivirile pre-efectuate.

Dacă rulați jocul acum, ar trebui să puteți efectua scenariul pe care l-am prezentat mai sus fără probleme.


înlănțuirea

Cu această problemă stabilită, vom implementa înlănțuire sistem, care oferă jucătorului puncte suplimentare pentru meciurile care sunt cauzate de distrugerea unui alt meci.

Puteți vedea un exemplu de tip de situație pe care o spun mai jos:

În scenariul de mai sus, jucătorul mișcă blocul verde și creează un meci. Apoi, distrugerea blocurilor verzi determină căderea blocurilor albastre și crearea unui alt moment după câteva momente.

Vreau să ofer jucătorului puncte bonus pentru a obține ceva de genul acesta. În mod specific, doresc să aplic un multiplicator numărului de puncte pe care le primește jucătorul pentru fiecare meci și să aibă multiplicatorul să crească cu fiecare meci consecutiv făcut.

Efectuarea funcționării

Pentru a face acest sistem să funcționeze, vom face o nouă variabilă numită Lanţ, și apoi efectuați câteva mici modificări ale funcțiilor existente. Deci, mai întâi creați o nouă variabilă globală:

Variabila globală: Tipul lanțului = Numărul inițial Valoarea = 0

Variabila dvs. ar trebui să arate astfel:

Această variabilă va acționa ca un multiplicator pentru ca punctele să-i spună cât timp merge un lanț.

Acum mergeți la evenimentul care determină căderea blocurilor și eliminați Evenimentul Else care apelează FindMatches funcţie.

Acum du-te la FindMatches și găsiți locațiile în care faceți FloatingPointsText obiecte. Modificați instrucțiunile Set Text astfel încât să se utilizeze o formulă nouă:

Acțiune: FloatingPointsText> Set text Text = NumMatchesFound * 10 * Chain

Această modificare face ca textul plutitor să fie modificat în același mod în care punctele vor fi în cele din urmă.

Apoi, mergeți la secțiunea din FindMatches unde suni FindMatches din nou la sfârșitul evenimentului, și ștergeți acest apel și indicația de așteptare. De ce? Pentru că, dacă nu le-am îndepărtat, atunci FindMatches s-ar termina numit de prea multe ori și lanțurile nu vor fi inițiate corect.

(Din cauza modificărilor pe care le-am făcut mai devreme în acest articol, FindMatches va fi numit ori de câte ori toate blocurile sunt în grilă și nici unul nu se încadrează. Are multiple zone unde suntem FindMatches ar determina doar executarea simultană a mai multor instanțe ale funcției în același timp și ar putea afecta sistemul de puncte.)

În cele din urmă, vom face o altă modificare a acestei funcții. Mergeți la sfârșitul funcției și adăugați această acțiune după ce ați setat PointsGiven la 0:

Acțiune: Sistem> Valoare adăugată la variabila = "Lanț" = 1

Acum, ori de câte ori meciul găsește meciuri, îi dă jucătorului puncte, distruge blocurile, și apoi mărește valoarea Lanțului.

Noua versiune a FindMatches ar trebui să arate astfel:

Apoi, mergeți la GivePoints funcționează și modifică ambele acțiuni care măresc valoarea Scorului, astfel încât să ia în considerare valoarea lanțului:

Acțiune: Sistem> Adăugare la variabilă = Valoare valoare = 10 * Lanț

Cu această schimbare, GivePoints ar trebui să arate astfel:

Resetarea lanțului

Am implementat variabila Lanț ca multiplicator pentru punctele pe care le primește playerul (și numărul de puncte afișate în obiectele text plutitoare), dar mai avem încă un lucru pe care trebuie să-l facem: trebuie să adăugăm o declarație care resetează valoarea lanțului astfel încât să nu se mărească infinit.

Vom adăuga această declarație către În DragDrop Start Eveniment, astfel încât, ori de câte ori jucătorul începe să tragă un nou Bloc, acesta este considerat un lanț nou. Alt motiv pe care îl facem aici este acela că împiedică reinițializarea prematură a valorii lanțului, făcând astfel toate meciurile din ultima parte a unui lanț mai puțin valoroase.

Mergeți la În DragDrop Start Eveniment și adăugați această acțiune la lista de acțiuni:

Acțiune: Sistem> Valoare setată Variable = Valoare lanț = 1

Evenimentul dvs. ar trebui să arate astfel:

Dacă încerci jocul în acest moment, ar trebui să vezi că dacă faci un lanț ca cel pe care l-am demonstrat mai devreme în gif, primești 90 de puncte în loc de 60 de puncte.

Cu acest lucru, sistemul de înlănțuire este complet și ar trebui să puteți crea un lanț cât mai elaborat pe cât doriți fără probleme.


Fixarea căderii

Următorul lucru pe care vreau să-l acoperez este o problemă pe care am găsit-o cu sistemul care cade în bloc. Dacă petreceți o perioadă mare de timp jucând jocul nostru Match-3 în starea sa actuală, este posibil să fi observat o problemă în care, din când în când, un bloc nu va cădea, chiar dacă nu există nici un bloc în el.

Puteți vedea ce vreau să spun în imaginea de mai jos:


În ciuda faptului că nu există nici un bloc sub blocul galben, acesta nu a reușit încă să cadă în spațiul gol. Aceasta este o problemă rară, dar dacă nu se rezolvă, ar putea încă să risipească scorul cuiva și să îi împiedice să primească un lanț pe care l-au configurat sau chiar să-i provoace să-și piardă odată ce adăugăm funcția Game Over.

Problema provine din variabila BlockBeingMoved, care este utilizată de evenimentul care determină când blocurile trebuie să cadă pentru a se asigura că nu există blocuri care să fie mutate atunci când le spune unui bloc să completeze un spațiu gol. În unele situații, când jucătorul mișcă un bloc, această variabilă nu se resetează niciodată, iar blocurile nu cad, până când un alt bloc nu este mutat și se resetează corect. Pentru a rezolva acest lucru, vom adăuga o pereche de evenimente care vor seta și reseta această variabilă corect și vom elimina acțiunile actuale care stabilesc variabila, deoarece acestea nu funcționează corect.

Mai întâi, du-te la OnDragDrop Start și Pe DragDrop Drop Evenimente și eliminați toate acțiunile care se ocupă de BlockBeingMoved variabilă din aceste evenimente. Ar trebui să existe o acțiune în fiecare eveniment care trebuie eliminată.

Apoi, accesați Evenimentul care detectează când există un spațiu gol sub un bloc. Vom modifica condițiile acestui eveniment. Mai întâi asigurați-vă că acea condiție care verifică dacă BlockBeingMoved este egal cu 0 este la început. Apoi, adăugați o altă condiție la sfârșitul evenimentului, care verifică dacă nu se vor muta blocuri.

Aceasta este condiția pe care o veți adăuga:

Stare: Inversare: Bloc> Trage

Evenimentul dvs. ar trebui să arate astfel:


În final, vom adăuga încă două Evenimente la sfârșitul anului Fișa evenimentelor care se va ocupa de BlockBeingMoved variabil. Du-te la sfârșitul tău Fișa evenimentelor și adăugați aceste evenimente:

Eveniment: Stare: Bloc> Trageți Acțiune: Sistem> Setați variabila Name = BlockBeingMoved Value = 1
Eveniment: Stare: Sistem> Altă acțiune: Sistem> Setați variabila Name = BlockBeingMoved Value = 0

Noile dvs. Evenimente ar trebui să arate astfel:


Aceste evenimente se vor schimba efectiv BlockBeingMoved din 0 la 1 și din 1 la 0 ori de câte ori un bloc este mutat, sau este nu fiind mutate, respectiv. Dacă testați jocul în acest moment, ar trebui să puteți juca de câte ori doriți, fără a întâmpina probleme cu blocarea blocului.


Joc încheiat

Acum, când sistemul nostru de înlănțuire este în vigoare, vom adăuga scenariul de pierdere și un ecran de joc peste.

Primul lucru pe care trebuie să-l facem este să adăugăm un nou layout care va acționa ca jocul nostru pe ecran:

  1. În partea dreaptă a ecranului, faceți clic dreapta pe aspecte și selectați Adăugați aspectul.
  2. Selectați Adăugați foaia de evenimente.
  3. Mergeți la noul Layout și creați un nou BG Tile obiect.
    1. Alegeți imaginea GameOverBGTile.png de la BG Imagini folder din pachetul grafic pe care l-ați descărcat în timpul primului tutorial.
    2. Seteaza Poziţie la -6, -7.
    3. Seteaza mărimea la 613, 619.
  4. Creaza un nou spiriduș obiect.
    1. Alegeți imaginea GameOverText.png din pachetul grafic.
    2. Seteaza Poziţie la 303, 200.
  5. Creaza un nou Buton obiect.
    1. Seteaza Nume la RestartButton.
    2. Seteaza Poziţie la 262, 410.
    3. Seteaza mărimea la 100, 30.
    4. Seteaza Text la Repornire.

Acum, când ați instalat ecranul Joc peste, reveniți la aspectul inițial, Aspectul 1, și adăugați un element nou pe ecranul respectiv:

  1. În Layout 1, creați un nou spiriduș obiect.
  2. Folosește Galeata de vopsea instrument pentru a picta acest sprite în întregime roșu.
  3. Închideți editorul de animație.
  4. Seteaza Nume la GameOverArea.
  5. Seteaza Poziţie la 196, -30.
  6. Seteaza mărimea la 344, 150.
  7. Seteaza Opacitate la 0.

Ar trebui să observați că acest sprite este în aceeași poziție și de aceeași dimensiune ca și partea de sus a câmpului de joc. Vom folosi acest obiect sprite pentru a detecta când jucătorul a pierdut detectând când un bloc se ciocnește cu el. Mergi la Fișa evenimentului 1 astfel încât să putem începe să implementăm acest lucru.

Oprirea blocurilor din partea de sus

Înainte de a începe detectarea scenariului de pierdere, trebuie să adăugăm o nouă variabilă pe care o vom folosi pentru a opri blocurile atunci când au lovit GameOverArea astfel încât să nu se mai miște. Acest lucru va clarifica jucătorului că a pierdut.

Variabila globală: Tipul de mișcarePossible Type = Numărul Valoarea inițială = 0

Acum mergeți la evenimentul în care mutați blocurile și adăugați această condiție:

Stare: sistem> comparați variabila Variable = MovementPossible Comparison = egal cu value = 0

Evenimentul dvs. de mișcare ar trebui să arate astfel:

Acum că mișcarea folosește noua noastră variabilă, vom adăuga evenimentul care detectează condiția de pierdere:

 Eveniment: Condiție: Bloc> Se suprapune un alt obiect Object = GameOverArea Stare: Invert: Bloc> IsDragging Acțiune: Funcție> Call Function Name = "Game Over"

Evenimentul pe care tocmai l-am făcut va apela funcția de joc peste o dată când un bloc se suprapune GameOverArea. Acum o vom face Joc încheiat funcţie.

 Eveniment: Stare: Funcție> Funcție activată = Activare Nume = "Joc peste" Acțiune: Blocare> Setare activat Stare = Dezactivat Acțiune: Sistem> Valoare setată Variabilă = Layout = Layout 2

Cele două noi evenimente ar trebui să arate astfel:


Motivul pentru care am creat o funcție separată în loc de a face aceste acțiuni în cadrul evenimentului care detectează efectiv jocul este că acest eveniment privește doar anumite blocuri din cauza evenimentelor care îl declanșează. După cum puteți vedea în funcția pe care am făcut-o, dezactivați funcțiile de tragere ale blocului pentru a împiedica jucătorul să continue să facă meciuri după ce jocul a fost detectat. Dacă am făcut acest lucru în cazul în care detectează jocul, acesta ar dezactiva blocurile care au provocat jocul, iar celelalte blocuri ar putea fi totuși trase.

Acum, du-te la Fișa evenimentului 2; vom adăuga câteva funcționalități în RestartButton obiect pe care l-am făcut mai devreme. Adăugați un nou eveniment la Fișa evenimentului 2:

Eveniment: Stare: RestartButton> Activat pe Acțiune: Sistem> Mergeți la layout Layout = Layout 1

Evenimentul dvs. ar trebui să arate astfel:

Resetarea valorilor

Dacă jucați acum jocul, faceți un joc și apoi reporniți, ar trebui să observați că acesta se întoarce la layout-ul original, dar blocurile nu se mișcă. Motivul pentru aceasta este faptul că toate variabilele pe care le-am utilizat sunt Variabilele globale, astfel că unele dintre ele nu sunt resetate automat când restarim layout-ul.

Pentru a le reseta, trebuie să adăugăm o acțiune la adresa noastră La începutul planului Eveniment care le va reseta manual pentru noi.

Mergeți la La începutul planului Eveniment și adăugați această acțiune la evenimentul inițial înainte de a se apela buclele For:

Acțiune: Sistem> Resetați variabilele globale

Evenimentul dvs. ar trebui să arate astfel:

Dacă încercați din nou, nu mai trebuie să aveți această problemă.


Ce trebuie să faceți în continuare?

În acest moment, am trecut peste toate caracteristicile pe care am vrut să le acopere în cadrul acestor tutoriale.

Veți observa că jocul dvs. încă nu este exact la fel ca cea din demo de mai sus, cu cea mai mare diferență fiind faptul că jocul dvs. nu are un ecran de pornire. Am ales să nu trec peste crearea ecranului Start, deoarece este aproape exact același lucru cu crearea ecranului Game Over - lăsăm acest lucru ca un exercițiu pentru tine.

În schimb, voi discuta câteva caracteristici pe care le-ați putea adăuga la jocul dvs., care ar putea face mai bine sau mai interesant.


Blocuri de specialitate

Primul lucru pe care vreau să-l discutăm este blocurile de specialitate - blocuri care dau fie jucătorilor bonusuri, fie fac unele funcții unice.

Majoritatea jocurilor Match-3 includ blocuri de specialitate pentru a ajuta la descompunerea acțiunii și a face jocul mai interesant. În starea actuală, jocul poate continua teoretic, dar jocul nu se schimbă niciodată. Introducerea de tipuri diferite de blocuri din când în când poate ajuta la transformarea jocului într-un joc mai interesant atunci când a trecut o vreme.

Pentru a integra un bloc de specialitate, va trebui să schimbați modul în care sunt generate blocurile, astfel încât ori de câte ori un bloc este creat, există o șansă aleatorie că va deveni un bloc de specialitate. Există o serie de moduri de a face acest lucru, dar, în general, cel mai bine este de a genera doar un număr aleator între 1 și 100 și generează doar un bloc de specialitate atunci când valoarea aleatoare este între 95 și 100 sau alt domeniu pe care vă decideți.

Scopul dvs. ar trebui să fie de a face blocuri de specialitate rare, dar nu de asemenea rar. În acest fel, jucătorul le va obține în mod regulat suficient pentru a face jocul mai distractiv, dar nu atât de des încât distruge echilibrul jocului.

Bomb Blocks

Când vine vorba de blocuri de specialitate aveți multe opțiuni; una dintre cele mai frecvente este a bomba bloc.

Blocurile de blocuri provoacă distrugerea unor blocuri suplimentare atunci când sunt distruse. Ele sunt diferite în fiecare joc: în unele jocuri distrug toate blocurile care le înconjoară; în altele, distrug un întreg rând sau coloană de Blocuri.

În imaginea de mai jos, puteți vedea două tipuri de blocuri de bombe din jocul popular Candy Crush Saga:


Blocurile de blocuri sunt, în general, destul de simple de integrat:

  • Începeți cu un eveniment care ascultă pentru distrugerea blocurilor de bombe.
  • Ori de câte ori cineva este distrus, ar trebui să-și transmită poziția într-o funcție care va găsi și distruge apoi toate blocurile care vor fi, de asemenea, distruse de acel bloc de bombe.
  • De exemplu, dacă blocul de bombe ar trebui să distrugă toate blocurile din jur, ați trece poziția blocului de bombe într-o funcție care ar arăta la fiecare dintre pozițiile din jur pentru a vedea dacă există blocuri acolo.
  • Dacă găsește blocuri în aceste poziții, atunci le distruge.

Blocări de timp încetinite sau de oprire temporală

Un alt tip de bloc de specialitate pe care îl veți găsi într-o mulțime de jocuri este unul care încetinește cât de repede se mișcă blocurile sau le oprește în întregime.

Blocurile ca acestea sunt foarte simple.

  • La fel ca la blocurile de bombe, veți avea nevoie de un eveniment care să asculte atunci când unul dintre aceste Blocuri este distrus.
  • Ori de câte ori se întâmplă acest lucru, trebuie fie să vă schimbați MovementsPossible la 1 astfel încât blocurile să se oprească sau să modifice viteză astfel că blocurile se mișcă foarte încet.
  • Apoi, ar trebui să începeți un cronometru care durează o perioadă scurtă de timp, poate 10 - 15 secunde. Odată ce acest timer se termină, veți reseta viteza blocurilor și veți continua normal.

Trebuie să rețineți că jucătorul care activează un bloc de oprire temporală este activ în timp ce un alt bloc de timp este deja activ. În acest scenariu, trebuie să reporniți cronometrul sau să adăugați lungimea standard a cronometrului la cronometrul existent și să continuați în mod normal.


Alte moduri de joc

De asemenea, puteți lua în considerare adăugarea altor moduri de joc când jucătorul se plictisește de modul fără sfârșit pe care l-am creat.

Modul temporizat

Cel mai simplu mod de joc pe care îl puteți adăuga este cel în care jucătorul are o limită de timp, scopul fiind acela de a obține cât mai multe puncte înainte de expirarea timpului.

În acest scenariu, ați lăsa întregul cod de joc intact, cu excepția cazului în care adăugați oa doua condiție de pierdere la joc, prin care jocul se termină când cronometrul se termină (precum și atunci când Blocurile se află în partea de sus a ecranului).

Când începe jocul, veți începe un cronometru pentru durata de timp a modului și când se termină ceasul veți încheia jocul în același mod pe care îl faceți acum.

Modul Puzzle

În acest mod de joc, veți da jucătorului o placă de joc foarte specifică pe care o proiectați în avans și îi cereți să elimine toate blocurile în cât mai puține swapuri posibil.

(Probabil că doriți să opriți mișcarea blocurilor, deoarece dacă blocurile se mișcă, vor apărea și blocuri noi în timp.)

Acest mod ar necesita să puteți configura o anumită rețea de blocuri, așa că ar trebui să aveți un sistem care să vă permită să treceți într-o configurație specifică de bloc atunci când jocul începe, mai degrabă decât să generați unul în întregime la întâmplare, așa cum facem acum.

Pe deasupra, în timp ce acest mod de joc ar fi relativ ușor de implementat, ar trebui să faceți o mulțime de puzzle-uri manuale pentru a crea o mulțime de puzzle-uri unice pentru ca jucătorul să încerce și să rezolve.

Adăugarea unui mod de joc ca acesta poate fi destul de consumatoare de timp datorită întregii creații de conținut necesare, dar există o mulțime de jucători care să se bucure de ea. Se poate foarte bine să vă plătiți bine dacă puneți timpul.


Concluzie

În cursul acestei serii de tutorial, am construit un joc întreaga meci-3 de la început până la sfârșit. Există mult mai multe lucruri pe care le puteți face cu acest joc, dacă aveți timp și aveți imaginația, dar există și o mulțime de moduri în care puteți utiliza ideile pe care le-am prezentat pentru a vă ajuta cu alte proiecte de jocuri.

Continuă să lucrezi la jocul tău și continuă să explorezi idei noi, pentru că nu știi niciodată când ceva învățat aici ar putea fi util mai târziu.

Sper că, fie că ați trecut prin întreaga serie, fie că ați trecut peste părțile pe care nu le puteați face singuri, ați învățat ceva din asta. Dacă aveți probleme sau comentarii, anunțați-ne în discuțiile de mai jos fiecare articol - mi-ar plăcea să vă aud de la dvs. și să văd ce răsturnări veți adăuga. În orice caz, vă mulțumim pentru lectură și noroc cu jocurile dvs.!