Construiește un joc fără sfârșit de la zero joc peste & scor

În acest tutorial vom crea două caracteristici noi care vor adăuga într-adevăr o strălucire la jocul nostru: scor și joc peste. Poate că sună ca o mulțime de lucruri, dar jocul nostru este creat pentru a face acest lucru rapid și ușor de făcut. Deci, hai să obținem acele caracteristici acolo și să finalizăm jocul nostru!

Prima caracteristică pe care o vom aborda este sistemul de notare. Pentru a obține un sistem de punctaj bun, trebuie să adăugăm un text plin de vizibilitate jocului nostru. Puteți începe prin a descărca un font nou ales de dvs. sau descărcând unul pe care l-am inclus în fișierul de descărcare al tutorialului. Dacă alegeți propria dvs., asigurați-vă că descărcați un fișier ".ttf". Există o mulțime de site-uri excelente disponibile cu fonturi gratuite; puteți începe prin a căuta pur și simplu "fonturi gratuite" și răsfoiți până când veți găsi ceva ce vă place. Fișierul de descărcări este configurat în același mod ca și în proiectele anterioare. Există un dosar vechi și un dosar nou: Dosarul vechi conține tot ceea ce am făcut până acum și noul folder conține proiectul așa cum va arăta la sfârșitul acestui tutorial.

Odată ce aveți acest lucru în folderul care conține fișierul principal.lua, mergeți mai departe și deschideți atât fișierul principal.lua, cât și fișierul build.settings și lăsați-l să funcționeze. Primul lucru pe care o vom face este să lucrăm cu fișierul build.settings. De aici vom lăsa programul să știe să includă fontul personalizat.

Schimbați fișierul build.settings pentru a arăta astfel:

 setările = orientation = default = "landscapeRight", content = "landscapeRight", supported = "landscapeRight", --adăugă fontul BorisBlackBloxx.ttf în jocul nostru - codul -code, dar dacă nu aveți referință aici, acesta nu va funcționa iphone = plist = UIAppFonts = "BorisBlackBloxx.ttf",

Rețineți că aceasta va fi aceeași chiar dacă aveți un dispozitiv Android. Sunt în principal dezvoltator de iOS când vine vorba de dezvoltarea jocului, așa că nu am testat acest lucru pe un dispozitiv Android. Cu toate acestea, acest script exact ar trebui să funcționeze atât pe dispozitivul dvs. Android, cât și pe dispozitivul dvs. iOS. (În cazul în care utilizatorii de Android care trec peste aceste probleme de întâlniri tutorial, vă rugăm să-mi spuneți și voi căuta în continuare!) Acum, că codul de mai sus este în loc, aveți posibilitatea să mergeți mai departe și închideți acest fișier ca nu va trebui să-l atingeți mai mult. Vom verifica dacă a lucrat prin adăugarea unui text în joc.

Să deschidem fișierul principal.lua și să oferim jucătorilor noștri un sistem de notare! Chiar deasupra locului în care creăm grupurile noastre de afișare, introduceți următoarele:

 --variabilă pentru a ține scorul jocului nostru local scor = 0 - scorText este o altă variabilă care deține un șir care are scorul de informații - când actualizăm scorul vom avea întotdeauna nevoie să actualizăm și acest șir - ***** Notă pentru utilizatorii de Android, poate fi necesar să includeți extensia de fișier a fontului pe care îl alegeți aici, deci ar fi BorisBlackBloxx.ttf acolo ****** scor localText = display.newText ("scor:" ... scor, 0, 0, "BorisBlackBloxx", 50) - Acest lucru este important pentru că dacă nu aveți această linie, textul se va păstra în mod constant - nu se va alinia în mod corespunzător de-a lungul punctului fix.Text: setReferencePoint (display.CenterLeftReferencePoint) scoreText .x = 0 scoreText.y = 30

Următorul lucru pe care îl vom face este să-l adăugăm în ecranul nostru de displayGroup. Puneți acest lucru după ce toate celelalte grupuri au fost adăugate la grupul de ecran:

 Ecran: introduceți (scoreText)

Du-te și alerga asta. Acest lucru va progresa foarte repede, deci asigurați-vă că totul funcționează corect înainte de a vă deplasa. Ar trebui să vedeți ceva de genul:

Odată ce ați testat acest lucru pentru a vă asigura că funcționează, vom actualiza scorul astfel încât să aibă o valoare imediată în jocul nostru. În funcția updateBlocks (), chiar sub linia care spune:

if ((blocuri [a]). x < -40) then, put this code:

 scor = scor + 1 scorText.text = "scor:" ... scor scorText: setReferencePoint (display.CenterLeftReferencePoint) scoreText.x = 0 scoreText.y = 30

Acest lucru va actualiza doar scorul nostru cu un punct de fiecare dată când un bloc trece de pe partea stângă a ecranului și este reintrodus în dreapta. Acest lucru poate fi folosit în multe moduri diferite, desigur. Este o idee inteligentă de a actualiza scorul aici pentru că va păstra consecvent în fiecare joc. Se bazează scorurile pe cât de departe au jucat jucătorii. De fapt, dacă ați dori să înregistrați cât de departe au călătorit, pur și simplu veți stoca scorul în variabila numită distanceTravelled, meters sau ceva similar cu.

Următoarea caracteristică pe care o vom aborda se referă la ceea ce se întâmplă atunci când un jucător moare. Vom păstra acest lucru simplu în acest tutorial, dar ar trebui să puteți vedea cum ați putea încorpora mai mult în acest lucru după ce am terminat. Rețineți că adăugarea la scor este într-adevăr destul de simplă. Să spunem că ați vrut să faceți creșterea scorului cu cinci de fiecare dată când ucizi o fantomă sau un obstacol. Ați pune pur și simplu codul de mai sus în secțiunea de detecție a coliziunii chiar în cazul în care distrugeți obiectele menționate.

Când personajul nostru moare, vom face mai multe lucruri:

1) Opriți mișcarea jucătorului.

2) Faceți jucătorul să se rotească în cercuri pentru efect dramatic. Facem asta aici pentru că vreau doar să vă arăt funcția de rotire a obiectelor de afișare. Poți, bineînțeles, să-ți schimbi moartea în tot ceea ce vrei să fie.

3) Afișați un ecran peste jocul care permite jucătorului să repornească jocul dacă alege.

În primul rând, trebuie să ne asigurăm că viteza jocului este setată la 0. Apoi, trebuie să adăugăm o variabilă obiectului nostru de afișare a monștrilor. Faceți acest lucru adăugând următoarea linie de cod în care instanțiăm un monstru:

 monster.isAlive = adevărat

Cu asta, vom verifica statutul său în câteva locuri diferite din joc. Prima modificare pe care o vom face este să actualizămMonster (), să mergem mai departe și să facem updateMonster () să arate astfel:

 (monster.isAlive == true) atunci dacă (onGround) atunci dacă (wasOnGround) atunci altceva monstru: pregăti (monster.accel> 0) atunci monster.accel = monster.accel - 1 sfarsit monster.y = monstru (monster.accel> 0) .yy - monster.accel monster.y = monster.y - monster.gravity altceva monstru: rotire (5) end --update coliziuneRect pentru a rămâne în fața colizunii monstruRect.y = sfârșitul monster.y

Observați că înainte de a actualiza poziția monștrilor, verificăm mai întâi dacă jucătorul este în viață sau nu. Dacă jucătorul este în viață pur și simplu mergem așa cum ne-ar face normal. Dacă jucătorul nu este în viață, trimitem monstrul nostru într-o rotire fără sfârșit. Apoi, trebuie să schimbăm starea monster.isAlive. Mergeți la funcția checkCollisions () și vom efectua modificările. În interiorul coliziunilor de verificare, poziția monștrilor este verificată în funcție de 3 elemente diferite pentru coliziuni: blocuri, fantome și vârfuri. În fiecare dintre aceste secțiuni am setat viteza jocului la 0 când este detectată o coliziune. Ceea ce trebuie să faceți acum este să adăugați acest cod la fiecare dintre cele trei secțiuni imediat după ce am setat viteza la 0.

 monster.isAlive = false - acest lucru întrerupe pur și simplu actualul monstru de animație: pauză ()

Acum este setat astfel încât orice animație să se joace se va opri când veți muri. De asemenea, monstrul se va roti în loc datorită codului pe care l-am adăugat deja pentru updateMonster (). Rulați din nou jocul și ar trebui să vedeți acest lucru:

În acest moment avem două din cele trei lucruri pe care le-am făcut pentru a face procesul de moarte mai bun în jocul nostru. Ultimul lucru este să faceți un mic ecran de moarte care să permită jucătorului să repornească jocul dacă alege. Mergeți înapoi în partea de sus a fișierului în care adăugăm toate obiectele displayObjects și adăugați aceasta:

 jocul localOver = display.newImage ("gameOver.png") gameOver.name = "jocOver" gameOver.x = 0 gameOver.y = 500

Pentru că acesta este un meniu simplu, am mers înainte și l-am făcut o imagine mare. Am folosit aceeași metodă pe care am făcut-o pentru restul imaginilor și am păstrat-o în afara ecranului pentru o utilizare ulterioară. Acum, ceea ce trebuie să facem este să mutați asta pe ecran de fiecare dată când jucătorul nostru moare. Mergeți înapoi la secțiunea de cod pe care tocmai am lucrat cu unde am setat monster.isAlive = false. Mai jos, adăugați următoarele la fiecare dintre aceste secțiuni:

 jocOver.x = display.contentWidth * .65 gameOver.y = display.contentHeight / 2

Asigurați-vă că ați adăugat

 Ecran: introduceți (GameOver)

la codul dvs., astfel încât jocul să apară corect. Puneți-l ca ultimul lucru care trebuie adăugat imediat după textScore. În felul acesta este sigur să fim vizibili când îl mutăm.

Acest lucru va pune ecranul "Game Over" chiar în partea dreaptă a monstruului de rotire, pentru a putea vedea în continuare scorul nostru final în partea stângă sus a ecranului. În cele din urmă, pentru ca toate acestea să funcționeze, trebuie să facem să facem ceva când o atingem. Așa că vom edita ulterior funcția atured (). Modificați-vă funcția atinsă pentru a arăta astfel:

 funcția atinsă (eveniment) dacă (event.x < gameOver.x + 150 and event.x > gameOver.x - 150 și event.y < gameOver.y + 95 and event.y > gameOver.y - 95), apoi restartGame () altfel dacă (monster.isAlive == true) atunci dacă (event.phase == "a început"), atunci dacă (event.x < 241) then if(onGround) then monster.accel = monster.accel + 20 end else for a=1, blasts.numChildren, 1 do if(blasts[a].isAlive == false) then blasts[a].isAlive = true blasts[a].x = monster.x + 50 blasts[a].y = monster.y break end end end end end end end

Observați că am făcut doar o schimbare la acest lucru: în loc să verificăm mai întâi pentru a vedea în ce parte a ecranului se află atingerea (cum determinăm saltul sau focul), verificăm dacă a fost atins obiectul gameOverdisplay. Dacă nu a fost atins și monstru este în viață, sărută și arde ca normal. Dar dacă gameOver a fost atins, înseamnă că jocul sa terminat deoarece este acum vizibil și pur și simplu sunăm funcția restartGame (). Undeva deasupra lui se adauga functia restartGame () si asta va face totul pentru noi.

 funcția restartGame () - meniul de mutare gameOver.x = 0 gameOver.y = 500 - reseta scorul de scor = 0 - reseta viteza jocului viteza = 5 - repara monstrul monster.isAlive = true monster.x = 110 monster.y = 200 monstru: pregăti ("running") monstru: play () monster.rotation = 0 - reseta la solLevel groundLevel = groundMin pentru a = 1, blocks.numCopii, 1 blocuri [a]. a * 79) - 79 blocuri [a] .y = end groundLevel - resuscitare fantome pentru a = 1, ghosts.numChildren, 1 do fantome [a] .x = 800 fantome [a] .y = 600 end - resetați spikele pentru a = 1, spikes.numChildren, faceți 1 vârfuri [a] .x = 900 vârfuri [a] .y = 500 end - resetați blasturile pentru a = 1, blasts.numCopii, faceți 1 blastică [a ] .x = 800 blasturi [a] .y = 500 final - reseta fundalul backgroundfar.x = 480 backgroundfar.y = 160 backgroundnear1.x = 240 backgroundnear1.y = 160 backgroundnear2.x = 760 backgroundnear2.y = 160 sfarsit

Rulați asta și, sperăm, ar trebui să aveți acum o mică funcție de ecran de moarte pe care să o puteți atinge pentru a reporni jocul.

Cu aceste mici modificări, ar trebui să avem acum un joc pe deplin funcțional! Jucătorul câștigă un scor și ne ocupăm de moarte mai puțin grațios. Tot ceea ce am făcut aici a fost foarte simplu, dar sperăm că acum aveți o idee despre cum puteți crea meniuri mai mari sau cum ați putea face o scenă mai moștenită de moarte când veți muri. O modalitate ușoară ar fi pur și simplu să adăugați câteva animații noi care să se potrivească cu decesele diferite, dar vă voi permite să decideți ce se potrivește cel mai bine jocului dvs. Dacă aveți întrebări cu privire la modificările pe care le-am făcut, vă rugăm să anunțați-ne în comentarii. Mulțumesc că ați urmat!

Cod