Bine ați venit în cea de-a cincea tranșă a seriei Endless Runner! Până în acest moment ar trebui să avem un mic monstru care rulează pe o platformă de derulare fără sfârșit. Ar trebui să avem trei niveluri de derulare a paralaxelor, interacțiunea dintre spritele noastre monstru și pământ, precum și capacitatea de a face să sară prin interacțiune tactilă. Așadar, pasul de astăzi va oferi utilizatorilor o provocare: mai degrabă decât să ruleze pe teren plat, vor exista schimbări de nivel și gropi pe care vor trebui să le sară pentru a continua să joace.
Vom realiza această provocare plăcută prin adăugarea unui "sistem de evenimente". Acest lucru nu ar trebui să fie confundat cu evenimentele încorporate pe care le utilizează SDK-ul Corona. Pentru scopurile noastre, cuvântul "eveniment" este pur și simplu o modalitate ușoară de a explica ce se întâmplă. Acest tutorial va folosi același format ca cel din urmă. În fișierul de descărcare veți găsi două dosare: "vechi" și "nou". Dacă nu ați urmat celelalte tutoriale și doriți doar să sarăți direct în acesta, puteți deschide pur și simplu dosarul vechi și va avea toate fișierele de care aveți nevoie pentru a începe. Noul dosar va conține proiectul finit, deci dacă doriți să vedeți cum arată totul la sfârșit, nu ezitați să faceți un punct culminant.
Este posibil să recunoașteți cuvântul "eveniment" din tutoriile anterioare. De exemplu, uitați-vă la funcția atinsă:
funcția atinsă (eveniment) dacă (event.phase == "a început"), atunci dacă (event.x < 241) then if(onGround) then monster.accel = monster.accel + 20 end end end end
În această funcție am folosit cuvântul "eveniment" pentru a descrie pur și simplu ce se întâmplă. Am putea folosi foarte bine următorul cod:
(kapow.phase == "started") atunci dacă (kapow.x < 241) then if(onGround) then monster.accel = monster.accel + 20 end end end end
"Evenimentul" sau "kapow" sunt pur și simplu variabile pe care le folosim. Evenimentul se întâmplă să fie mai descriptiv decât "kapow". Deci, când spunem "eveniment" nu vorbim despre o variabilă care descrie ceva care se întâmplă (așa cum se arată în exemplul anterior), dar folosim cuvântul ca o modalitate de a descrie un sistem care controlează fluxul jocului . S-ar putea să vă întrebați ce lucruri poate controla acest "sistem de evenimente". Cât de distractiv este demo-ul nostru acum? Este ceva pe care doriți să-l încercați să îl vindeți? Chiar mai important, este ceva ce cineva ar vrea să joace? Răspunsul este un dureros nu, deoarece alergarea și săriturile fără obstacole sunt plictisitoare.
Pentru a face jocul nostru mai interesant, trebuie să adăugăm caracteristici. Lucruri precum nivelele de schimbare a terenului, gropi, obstacole, băieți răi etc. vor face jocul mult mai interesant. Cu toate acestea, într-un joc ca Endless Runner nu putem avea aceleași obstacole care apar în același timp în fiecare joc. Trebuie să avem totul la întâmplare. Asta face ca aceste jocuri să fie atât de dependente. Deci, acesta este locul în care "sistemul nostru de evenimente" este într-adevăr să strălucească. În acest tutorial vom discuta cum să creați două evenimente diferite: în primul rând, nivelurile de schimbare la sol în sus și în jos, și în al doilea rând, crearea unei groapă. Aceste evenimente vor fi generate aleatoriu la intervale aleatorii. Există mai multe moduri în care puteți face acest lucru. Pentru acest exemplu, modul cel mai logic este de a verifica dacă trebuie să începem un nou eveniment de fiecare dată când mutăm unul din piesele noastre de bază înapoi în partea dreaptă a ecranului. Să mergem mai departe și să ne uităm la ceea ce avem nevoie pentru a face acest lucru.
Continuați și deschideți fișierul principal.lua din dosarul vechi și vom începe să facem unele modificări. Primul lucru pe care trebuie să-l faceți este să adăugați câteva variabile pe care le vom folosi pe tot parcursul programului. Adăugați aceste linii în partea superioară a fișierului chiar sub linia de cerințe sprite:
--aceste două variabile vor fi controalele care controlează sistemul nostru de evenimente. inEvent local = 0 eveniment localRun = 0
Apoi, mergeți la funcția updateSpeed și schimbați viteza. Ar trebui să alegem o creștere lentă și graduală a vitezei, astfel încât jocul să progreseze așa cum v-ați aștepta. Modificați linia la aceasta:
--acest lucru va încetini drastic cât de repede accelerează plăcile. - ajustați acest număr pentru a obține jocurile mai aproape de ceea ce funcționează pentru jocul dvs. viteza = viteza + .0005
Următorul lucru pe care îl vom face este să adăugăm primul nostru eveniment. Primul nostru eveniment va face ca fiecare dintre blocuri să se schimbe la o înălțime nou ajustată de fiecare dată când unul este mutat în partea opusă a ecranului. Acest lucru se va întâmpla, desigur, la întâmplare, astfel încât jocul nostru să fie mereu nou și interesant. Pentru a începe sistemul nostru de evenimente, schimbați mai întâi actualizările funcțiilor Blocări () pentru a arăta astfel:
() pentru a = 1, blocks.numChildren, 1 dacă dacă (a> 1), atunci newX = (blochează [a - 1]) x + 79 altceva newX = viteza de sfârșit dacă ((blocuri [a]) < -40) then (blocks[a]).x, (blocks[a]).y = newX, groundLevel checkEvent() else (blocks[a]):translate(speed * -1, 0) end end end
Prima linie ar face pur și simplu poziția y a blocului să fie aceeași ca înainte de a face o suprafață de rulare plat pe care am văzut-o până acum. Al doilea schimbă poziția y pentru a fi indiferent de nivelul de bază. Nivelul variabil al solului va fi schimbat aleator în intervale mici în următoarele funcții. Mergeți mai departe și adăugați aceste funcții oriunde sub funcția de actualizare.
function checkEvent () - inainte de a verifica daca ne aflam deja intr-un eveniment, dorim doar 1 eveniment sa se intample la un moment dat daca (eventRun> 0) atunci - daca suntem intr-un eveniment declin eventRun. eventRun este o variabilă care ne spune cum - mai mult evenimentul va avea loc. De fiecare dată când verificăm, trebuie să scădem -. Apoi, daca in acest moment eventRun este 0 atunci evenimentul sa incheiat astfel incat am setat inEvent inapoi - la 0. eventRun = eventRun - 1 daca (eventRun == 0) apoi inEvent = 0 end end - daca suntem intr-un eveniment atunci nu face nimic dacă (inEvent> 0 și eventRun> 0), apoi - Nu mai facem altceva - dacă nu suntem într-un eveniment de verificare pentru a vedea dacă vom începe un nou eveniment. Pentru a face acest lucru - generăm un număr aleator între 1 și 100. Apoi verificăm dacă verificarea noastră este - pentru a începe un eveniment. Aici folosim 100 de exemple, deoarece este ușor de determinat - probabilitatea ca un eveniment să se declanșeze (Am putea la fel de ușor ales 10 sau 1000). - De exemplu, dacă decidem că un eveniment se va începe - de fiecare dată când verificarea este peste 80, atunci știm că de fiecare dată când un bloc este resetat, există o probabilitate de 20% ca un eveniment să înceapă. Deci unul din fiecare bloc ar trebui să înceapă un eveniment nou. Acest lucru este acolo unde va trebui să vă potriviți nevoilor jocului dvs. check = math.random (100) - acest prim eveniment va determina schimbarea înălțimii terenului. Pentru acest joc, ne dorim ca elevația să schimbe câte un bloc la un moment dat, astfel încât să nu avem lungi runde de schimbare, ceea ce este imposibil de trecut, deci setăm eventRun la 1. dacă (bifați> 80 și verificați < 99) then --since we are in an event we need to decide what we want to do. By making inEvent another --random number we can now randomly choose which direction we want the elevation to change. inEvent = math.random(10) eventRun = 1 end end --if we are in an event call runEvent to figure out if anything special needs to be done if(inEvent > 0), apoi runEvent () end end - această funcție este destul de simplă, doar verifică pentru a vedea ce eveniment ar trebui să se întâmple, apoi - actualizează elementele corespunzătoare. Rețineți că verificăm dacă solul se află într-un anumit interval, nu dorim ca solul să se dezvolte deasupra sau sub ceea ce este vizibil pe ecran. funcția runEvent () dacă (inEvent < 6) then groundLevel = groundLevel + 40 end if(inEvent > 5 și inEvent < 11) then groundLevel = groundLevel - 40 end if(groundLevel < groundMax) then groundLevel = groundMax end if(groundLevel > groundMin), apoi groundLevel = groundMin end end
Prima verificare a funcției va fi apelată de fiecare dată când resetăm locația blocului. Deci, continuați și apelați checkEvent () imediat după linia pe care am editat-o în updateBlocks (). De fiecare dată când checkEvent () este chemată, verificăm dacă trebuie sau nu să începem un eveniment. De asemenea, va verifica dacă un eveniment este deja difuzat. Acest lucru ne va ajuta sa ne controleze comportamentele, astfel incat sa nu facem prea multe evenimente nenorocite care reproduc la un moment dat. Rulați acest lucru și acum ar trebui să aveți un joc care este mult mai distractiv de jucat!
Observați că, dacă intrăți într-un zid, nu muriți; vă opriți pur și simplu. Acest lucru este suficient pentru acum. Amintiți-vă că atunci când mori sau oricând doriți să reporniți simulatorul, trebuie doar să apăsați butonul de control sau comanda R și nivelul va reporni instantaneu.
Acum puteți vedea cum creăm evenimente pentru a controla fluxul jocului. Acum vom adăuga un al doilea eveniment, dar de data aceasta nu vom folosi runEvent pentru a face schimbările. Vom adăuga o groapă pe care jucătorul va trebui să o sară pentru a continua să joace. Acest lucru poate fi adăugat destul de repede, așa că hai să mergem la lucru!
Primul lucru pe care trebuie să-l faceți este să adăugați o altă verificare în funcția checkEvent (). Adăugați această secțiune chiar sub celălalt verificare din aceeași declarație if / else:
dacă (verificați> 98) atunci inEvent = 11 eventRun = 2 sfârșit
Apoi, accesați funcția updateBlocks () și modificați secțiunea care arată astfel:
if ((blocuri [a]). x < -40) then (blocks[a]).x, (blocks[a]).y = newX, groundLevel checkEvent() else (blocks[a]):translate(speed * -1, 0) end
Asigurați-vă că arată astfel:
if ((blocuri [a]). x < -40) then if(inEvent == 11) then (blocks[a]).x, (blocks[a]).y = newX, 600 else (blocks[a]).x, (blocks[a]).y = newX, groundLevel end checkEvent() else (blocks[a]):translate(speed * -1, 0) end
Dupa ce ati fugit, ar trebui sa aveti un al doilea eveniment in jocul care poate da nastere la groapa!
Observați, totuși, că în loc de a defini acțiunea care se va întâmpla în interiorul funcției runEvent, o facem direct în interiorul funcției updateBlock (). Acesta este motivul pentru care sistemele de eveniment, cum ar fi acesta, sunt utile. Ne permite să definim cu ușurință evenimentele și să actualizăm jocul în zonele codului nostru care ne fac cel mai mult sens. Sperăm că acest lucru vă oferă o idee despre ceea ce puteți face cu evenimentele. Sa te distrezi jucand cu ei si sa-ti faci jocul plin de evenimente interesante. În următorul tutorial, vom adăuga încă două evenimente pentru a păstra jocul provocator: monștri răi și obstacole distruse! Deci, tonul viitoare, și dacă aveți întrebări, vă rog să-mi spuneți în comentarii.