Faceți un joc Match-3 în Construct 2 Animații și Blocarea blocurilor

În articolul precedent din această serie, am petrecut timp înființând jocul nostru astfel încât să avem toate imaginile necesare în loc și să jucăm la întâmplare o gamă de blocuri pentru jucător. Cu sistemele în vigoare, vom lucra acum pe funcționalitatea de bază și oferindu-le jucătorului posibilitatea de a manipula câmpul de joc.


Joc final Demo

Iată o demonstrație a jocului pe care lucrăm în această serie:




1. Adăugarea animației

Am încheiat tutorialul precedent după ce fiecare afișare a blocului a fost diferită. M-am gândit că ar fi bine să ridic din acel loc exact și să încep prin a adăuga animație blocurilor astfel încât imaginile să se schimbe în funcție de ceea ce face sau a făcut jucătorul. Prima animație pe care o vom adăuga este un eveniment cu mouse-over.

Mai întâi, adăugați a șoarece obiecte pentru Aspectul 1. Apoi, întoarce-te la Fișa evenimentului 1 și adăugați un nou Eveniment.

 Eveniment: Mouse> Cursorul este peste obiect Obiect = Blocare Acțiune: Bloc> Setare Valoare Cadru = (Bloc.Color-1) * 3 + 2

Acum, dacă intri în joc, imaginea blocurilor ar trebui să se schimbe când treceți peste ele și să vă schimbați atunci când mutați cursorul.

Avem încă un eveniment de animație:

 Eveniment: Bloc> Este setată variabila de instanță booleană Variabila instanță = IsMatched Acțiune: Bloc> Setare valoare cadru = (Bloc.Color-1) * 3 + 3

De asemenea, trebuie să ne asigurăm că atunci când plasați cursorul peste un bloc corespunzător, imaginea nu se schimbă, deci adăugați o altă condiție la evenimentul de mișcare a mouse-ului pe care l-am făcut:

 Condiție: Invert: Block> Este setată variabila de instanță Boolean Instance variable = IsMatched

Inversând acest lucru înseamnă că imaginea de hover este folosită numai dacă blocul nu face parte dintr-un meci. Deoarece nu avem încă un sistem de potrivire, nu ar trebui să vedeți nicio modificare, dar pe măsură ce avansăm, acest eveniment va intra în joc.

Cu toate cele trei evenimente prezente, foaia de eveniment ar trebui să arate astfel:



2. Schimbarea a două blocuri vecine

Următorul lucru la care vom lucra este acela de a oferi jucătorului posibilitatea de a schimba blocurile vecine. Pentru a face acest sistem funcționează, vom folosi o combinație de Arrays și Functions, deci dacă nu le-ați folosit în C2 înainte, consultați manualul pentru a afla mai multe.

Ce căutăm spre lucruri

Înainte de a vă explica cum să faceți acest sistem, vreau să vedeți ce facem și să explicați pe scurt cum funcționează. Pentru a vedea cum va fi sistemul, redați demo-ul de mai jos. Pentru a schimba blocurile, pur și simplu dați-le și trageți-le peste un loc învecinat într-una din cele patru direcții cardinale.

Faceți clic pentru a încărca demonstrația.

Ar trebui să observați că atunci când începeți să trageți un bloc, patru blocuri colorate vor apărea pe partea superioară a blocurilor care se află imediat lângă acesta. Când eliberați blocul, există un eveniment care verifică dacă blocul se suprapune pe oricare dintre aceste pătrate colorate.

Dacă blocul se suprapune cu unul din patratele colorate, acesta înlocuiește blocul pe care l-ați mutat cu blocul în care a fost desenat pătratul colorat sau ați repoziționat blocul mutat în noua locație. Dacă blocul tău nu se suprapune cu unul din patratele colorate, nu face nimic. De asemenea, nu face nimic dacă blocul se suprapune cu mai multe patrate colorate.

Motivul pentru care folosim acest sistem, mai degrabă decât să verificăm dacă blocul însuși se suprapune unui alt bloc, este că nu avem nici o modalitate ușoară de a verifica unde cele două blocuri sunt relativ una de alta. Prin repoziționarea patratelor colorate în locațiile valabile și apoi prin utilizarea lor ca bază pentru verificările noastre, avem o idee mult mai bună despre ceea ce jucătorul intenționa să facă atunci când au încercat să facă o schimbare.

Adăugarea blocurilor colorate

Acum, când înțelegem ce se întâmplă, putem începe să o punem în aplicare. Mergi la Aspectul 1 și adăugați a Funcţie obiect și an mulțime obiect. Paraseste Funcţie numele obiectului ca Funcţie, dar redenumiți mulțime la BlockPositions. Funcţie obiect ne va permite să folosim funcţii în codul nostru, și mulțime este ceea ce vom folosi pentru a stoca pozițiile blocurilor pe care le schimbăm. De asemenea, trebuie să setăm Înălţime și Adâncime a matricei la 2.

Odată ce ați făcut acest lucru, creați patru sprite noi pe care să le utilizați ca pătrate colorate:

  • Un sprite verde, numit BottomBlock.
  • Un sprite roșu, numit LeftBlock.
  • Un sprite galben, numit RightBlock.
  • Un sprite albastru, numit TopBlock.

Culorile nu contează, dar folosirea acestor culori face ca fiecare să fie diferit, astfel încât să fie ușor de identificat și face mai ușor să urmăriți, de vreme ce asta am făcut. Aceste sprite trebuie amplasate în afara aspectului, astfel încât jucătorul să nu le poată vedea.

De asemenea, trebuie să setați mărimea fiecăruia dintre acestea 30,30 și le dau câte un an Opacitate de 0. În demo-ul de mai sus, ele sunt fiecare câte puțin puțin transparente, pentru că am vrut să vedeți ce se întâmplă, dar în jocul real jucătorul nu ar trebui să le poată vedea deloc.

În cele din urmă, selectați-vă actualul bloc obiect și adăugați Trage si lasa comportament.

Acum du-te înapoi Fișa evenimentului 1 și să creeze un nou Eveniment cu șase acţiuni.

Eveniment: Bloc> În DragDrop trageți start Acțiune: BlockPositions> Set la XY X = 0 Y = 0 Valoare = Block.X Acțiune: BlockPositions> Set la XY X = 0 Y = 1 Valoare = Block.Y Acțiune: BottomBlock> X = Block.XY = Bloc.Y - (Block.Width + 2) Acțiune: TopBlock> Poziție set X = Block.XY = Block.Y + (Block.Width + 2) Acțiune: LeftBlock> Set Poziție X = Block. X - (Block.Width + 2) Y = Bloc.Y Acțiune: Blocare dreapta> Poziție setată X = Bloc.X + (Bloc. Lățime + 2) Y = Bloc.Y

Acest eveniment stochează poziția de plecare a blocului pe care l-ați mutat și acesta mișcă patratele colorate astfel încât să fie în poziția corectă față de blocul care se mișcă.

Evenimentul dvs. ar trebui să arate astfel:


Aflând ce face jucătorul

Următorul eveniment pe care îl vom adăuga va efectua cecul pentru a vedea ce schimb de date încearcă să facă jucătorul.

În primul rând, evenimentul va asculta atunci când jucătorul "scade" blocul în care se mișcă. Apoi, va efectua o serie de verificări pentru a vedea care blocuri patrate colorate, dacă există, cu care se blochează blocul, și fie efectuați swap-ul corespunzător, fie doar resetați poziția blocului mutat.

 Eveniment: Bloc> Pe DragDrop drop Sub-Event: Bloc> Actiune Blocare Blocare> Setare la XY X = 1 Y = 0 Valoare = BottomBlock.X Actiune: BlockPositions> Setat la XY X = 1 Y = 1 Value = BottomBlock .Y Acțiune: Bloc> Poziție setată X = BlockPositions.At (0,0) Y = BlockPositions.At (0,1)

Asa ar trebui sa arate asa:


Chiar acum, Eveniment conturile numai pentru swap-uri cu bloc sub cea care este mutată. Pentru a adăuga celelalte, faceți clic dreapta pe sub-eveniment și adăugați un altfel. Apoi, copiați condiția de la primul sub-eveniment în evenimentul Else, dar schimbați țintă BottomBlock la TopBlock.

Acum copiați acţiuni din sub-evenimentul inițial în evenimentul Else și modificați din nou orice instanță de BottomBlock la TopBlock. Faceți asta de două ori cu LeftBlock și RightBlock, astfel încât să aveți patru sub-evenimente totale, astfel încât setarea evenimentului dvs. să arate astfel:


În cele din urmă, adăugați încă un eveniment Else:

 Sub-eveniment: Altă acțiune: Bloc> Poziție setată X = BlockPositions.At (0,0) Y = BlockPositions.At (0,1)

Schimbarea blocurilor

De aici vom implementa mecanismul de schimbare în sine. Pentru a schimba blocurile, vom muta mai întâi blocul pe care playerul la tras către un loc în afara ecranului.

Facem acest lucru pentru că trebuie să localizăm blocurile în funcție de pozițiile lor înainte de a le putea manipula - dacă am pornit prin plasarea fiecărui bloc în poziția stocată a celuilalt bloc, le-ar pune ambele în aceeași locație și le vor face foarte greu separate unul de celălalt. Prin deplasarea blocului într-o locație specifică pe care noi nu o cunoaștem, nu vom mai fi în bloc, împiedicăm blocul să fie niciodată în aceeași locație ca un alt bloc și să împiedice sistemul să aibă o problemă care să determine ce bloc dorim.

Apoi vom muta blocul pe care l-au schimbat original blocați cu locația blocului original. În cele din urmă, vom muta blocul original la locația celui de-al doilea bloc din locația sa în afara ecranului și vom reseta informațiile din matrice 0.

 Eveniment: Funcție> Funcție activată Denumire: Sub-eveniment "SwapBlocks": Stare: Bloc> Comparare XX = BlockPositions.At (0,0) Stare: Bloc> Comparare YY = BlockPositions.At (0.1) Poziția X = -80 Y = -80 Sub-eveniment: Stare: Bloc> Comparați XX = BlockPositions.At (1,0) Stare: Bloc> Comparați YY = BlockPositions.At (1,1) = BlockPositions.At (0,0) Y = BlockPositions.At (0,1) Sub-eveniment: Stare: Bloc> Comparare XX = -80 Stare: Bloc> Comparare YY = -80 Acțiune: Bloc> .At (1,0) Y = BlockPositions.At (1,1) Acțiune: BlockPositions> Set la XY X = 0 Y = 0 Valoare = 0 Acțiune: BlockPositions> Set la XY X = 0 Y = : BlockPositions> Set la XY X = 1 Y = 0 Valoare = 0 Acțiune: BlockPositions> Set la XY X = 1 Y = 1 Valoare = 0

Ta Eveniment foaie pentru care ar trebui să arate astfel:


Acum, du-te înapoi la cele patru verificări pe care le-am făcut mai devreme, care au determinat ce culoare să pătrundă blocul tras cu care se ciocnează și adăugați acest lucru Acțiune până la sfârșitul anului acţiuni pentru toate cele patru:

 Acțiune: Funcție> Funcție apel Nume: "SwapBlocks"

Asigurați-vă că jucătorul vrea să facă asta

Dacă rulați jocul acum, acesta va funcționa aproape perfect. Singurul lucru pe care nu îl face încă este să verificați dacă blocul se suprapune cu mai multe patrate colorate. (Dacă este, nu vrem să se întâmple nimic, deoarece înseamnă că mișcarea poate fi o greșeală.)

În prezent, verifică pătratele colorate în ordine Fund, Top, Stânga, Dreapta, și oricare ar găsi întâi, se schimba cu. Pentru a rezolva acest lucru trebuie să adăugăm două condiții inversate la fiecare verificare.

Pentru a Top și Fund verifică, adăugați aceste condiții:

 Stare: Inverted: Block> Se suprapune un alt obiect Obiect: LeftBlock Stare: Inverted: Block> Se suprapune un alt obiect Obiect: RightBlock

Pentru a Dreapta și Stânga verifică, adăugați aceste condiții:

 Stare: Inversat: Bloc> Se suprapune un alt obiect Obiect: TopBlock Stare: Inverted: Block> Se suprapune un alt obiect Obiect: BottomBlock

Deoarece patratele sunt de numai 30x30 pixeli, este imposibil ca blocul să se suprapună peste două capete opuse în același timp. Aceste verificări ne permit să ne asigurăm că mișcarea de tragere nu este înclinată prea mult pe ambele părți și asigură faptul că jucătorul are o mișcare aproape egală, astfel încât este clar că detectăm tipul corect de swap.

Ta Eveniment ar trebui să arate astfel:


Și aici este o demonstrație a jocului nostru în starea sa actuală:

Faceți clic pentru a încărca demonstrația.

Concluzie

Acum avem un mecanic complet de schimbare a funcțiilor. În următorul tutorial vom configura un sistem de detectare a potrivirii puternice și vom începe să vedem într-adevăr modul de joc în acțiune.

Dacă doriți să continuați să lucrați pe cont propriu, ar trebui să vă uitați la modul în care ați putea detecta când două blocuri au aceeași culoare și cum ați ști dacă sunt una lângă cealaltă și dacă formează un grup complet. Un loc bun pentru a începe ar fi cu a Sistem> Pentru fiecare eveniment cu bloc obiect, și efectuați un fel de verificare pe fiecare bloc individual.

Sper că v-ați bucurat de acest tutorial și vă bucurați de seria de până acum; asigurați-vă că reveniți în curând pentru următoarea tranșă.