Construiește un joc fără sfârșit al alergătorului de la zero bătăliile sefilor

Am parcurs deja un drum lung în construirea jocului nostru fără sfârșit. În acest moment din serie, ar trebui să aveți deja o experiență plăcută și plăcută, dar acest tutorial vă va învăța cum să adăugați încă o răsucire: bătăliile sefului!

Până acum jocul nostru începe de fapt să arate ca un joc real! Avem un caracter controlabil cu diferite tipuri de obstacole care sunt generate aleatoriu, avem parllax scrolling implementat în trei straturi diferite și avem un sistem de punctaj de bază care oferă jucătorilor noștri un sentiment de realizare. Până acum, bine. Acum, poate acest lucru este suficient pentru tipul de joc pe care îl proiectați și acesta este tot ce aveți nevoie. Cu toate acestea, să presupunem că vrei să-ți spice jocul cu ceva nou. Ceva ca ... o bătălie a sefuilor! În timp ce cele mai multe jocuri de defilare nesfârșite nu au nici un fel de luptă seful, va fi o practică bună să ne uităm la modul în care ne-am gândi la proiectarea acestui tip de eveniment. Deci sa începem!

Veți observa că din nou urmăm același format cu un dosar vechi în descărcarea atașată care conține întregul proiect pe care l-am creat până acum și un nou dosar care conține proiectul după ce am terminat acest tutorial. Primul lucru pe care trebuie să-l faceți este să vă asigurați că avem imaginile în dosarul corect. Puteți lua boss.png și bossSpit.png din noul folder din fișierul de descărcare atașat. Observați că șeful nu este animat și este doar o singură imagine. Dacă doriți un sef animat și ați uitat să animați un sprite în Corona, consultați tutorialul de animație sprite lansat mai devreme în această serie.

Acum că avem cei din același director ca fișierul principal.lua, mergeți mai departe și deschideți main.lua în editorul dvs. de text preferat. Nu voi explica foarte mult ce se întâmplă aici (Asigurați-vă că ați citit comentariile pentru sugestii și explicații mici!) Așa cum am făcut, în acest moment, deja am vorbit despre totul de mai multe ori și sunt sigur că ați fi sări peste el oricum. Acest lucru ne va ajuta, de asemenea, să trecem rapid prin tutorial, deoarece tot ceea ce facem aici am făcut mai devreme, deci este vorba doar de o mulțime de mici schimbări. Deci sa începem.

Primul lucru pe care îl vom face este ca imaginile noastre să fie încărcate în joc. Din nou, acest lucru ar trebui să pară familiar. Adăugați acest cod sus în locul în care încărcăm toate celelalte imagini. Doar asigurați-vă că șefii sunt declarați înainte de a încerca să puneți ceva în el!

 seful local = display.newImage ("boss.png", 150, 150) boss.x = 300 boss.y = 550 boss.isAlive = false boss.health = 10 boss.goingDown = true boss.canShoot = false --spitCycle este singurul lucru care nu este exploatarea de sine - de fiecare data cand mutam o piesa de la spate in partea dreapta a ecranului actualizam scorul cu unul. Acum actualizăm și ciclul - spite. De fiecare dată când spitCycle este un multiplu de trei - șeful își va împușca proiectilul. Acest lucru doar ține pasul - asta pentru noi! bossSpit.x = 400 bossSpit.y = 550 bossSpit.isAlive = false bossSpit.speed = 3 bossSpit.speed: inserați (bossSpit.png) bossSpit.x = bossSpit)

Apoi, asigurați-vă că le adăugați în ecran lângă celelalte adăugări, un loc bun pentru a le pune ar fi chiar înainte de a introduce collisionRect.

 ecran: inserați (șeful) ecran: inserați (bossSpits)

Salvați și rulați-o. Continuați și verificați-l în versiunea iPhone 4 și ar trebui să vedeți ceva de genul:

Acum, să-i facem să facă ceva. Modul în care ne vom ocupa de șeful nostru este faptul că, în mod aleatoriu, venim în joc ca și celelalte evenimente pe care le dorim ca acest lucru să se întâmple la un moment dat. Pentru acest exemplu, o vom seta la un număr mic, astfel încât acesta va ajunge rapid la eveniment, dar probabil că veți dori să faceți o perioadă mai rezonabilă în joc. Deci, ce se va intampla este de fiecare data cand monstrul tau trebuie sa ruleze o distanta egala cu un multiplu de 10. Seful va da nastere. Pe măsură ce noi facem șeful, facem ca terenul să devină plat la groundMin. De asemenea, oprim fantome și ziduri de spike de la spawning astfel încât nu există distragere a atenției de la luptă! Când se va arunca, va intra în scenă de sus și va începe să se bată în sus și în jos în timp ce scuipă căldura căutând bile galbene ... de moarte!

Deci, pe măsură ce seful împușcă jucătorul, jucătorul va trebui să omoare șeful prin împușcarea lui de zece ori. De asemenea, jucătorul se poate apăra de scuipat prin împușcare. Deci, strategia de bază pentru câștigare va fi săriturile și spam-ul său de calificare de fotografiere! Câteva alte lucruri pe care trebuie să le menționăm este că în acest joc am decis să nu actualizez scorul în timp ce șeful este în viață, în acest fel jucătorul este forțat să învingă șeful pentru a obține scoruri mai mari. Ultimul lucru pe care îl am înainte de a merge mai departe este că am șeful setat să arunce o lovitură la fiecare trei blockUpdates. Acest lucru are din nou avantajul că dificultatea scade în mod automat cu jocul. Acesta oferă, de asemenea, o modalitate ușoară de a scoate fotografiile consecvente. Nimic prea nebun, dar în general adaugă un joc frumos.

Pentru a face mai mult spațiu pentru seful de pe ecran mi-am mutat player-ul puțin mai înapoi pe ecran. Acum încep eroul așa:

 monster.x = 60

Acest lucru va deschide un nivel un pic. Următorul lucru pe care ar trebui să-l facem este să mergem mai departe și să ne ocupăm de funcțiile pe care le vom actualiza pe șeful și pe scuipatul șefului:

 funcția updateBoss () - verificați dacă șeful nu a fost ucis dacă (boss.health> 0) atunci - verificați dacă șeful trebuie să schimbe direcția dacă (boss.y> 210) atunci seful. goingDown = sfarsit false daca (boss.y < 100) then boss.goingDown = true end if(boss.goingDown) then boss.y = boss.y + 2 else boss.y = boss.y - 2 end else --if the boss has been killed make him slowly disappear boss.alpha = boss.alpha - .01 end --once the monster has been killed and disappear officially --kill him off and reset him back to where he was if(boss.alpha <= 0) then boss.isAlive = false boss.x = 300 boss.y = 550 boss.alpha = 1 boss.health = 10 inEvent = 0 boss.spitCycle = 0 end end function updateBossSpit() for a = 1, bossSpits.numChildren, 1 do if(bossSpits[a].isAlive) then (bossSpits[a]):translate(speed * -1, 0) if(bossSpits[a].y > monster.y), atunci șefii [a] .y = bossSpits [a] .y - 1 sfârșit dacă (bossSpits [a] .y < monster.y) then bossSpits[a].y = bossSpits[a].y + 1 end if(bossSpits[a].x < -80) then bossSpits[a].x = 400 bossSpits[a].y = 550 bossSpits[a].speed = 0 bossSpits[a].isAlive = false; end end end end

Cu cei de acolo, trebuie doar să facem unele ajustări pentru unele dintre celelalte funcții ale noastre și să le adăugăm la funcția noastră de actualizare ():

 updateBossSpit () dacă (boss.isAlive == true) apoi updateBoss () sfârșitul

Adăugați-le în funcția de actualizare, apoi mergeți la funcția checkEvent () și unde vedeți codul care arată astfel:

 dacă (inEvent> 0 și eventRun> 0), atunci - Nu mai face nimic

Chiar sub acea altă afirmație, goliți tot ce era acolo și schimbați-l cu acesta:

 --acesta este locul unde vom inmulti seful dupa fiecare 10 blocuri - controla si sanatatea sefului de aici daca (boss.isAlive == false si scor% 10 == 0) atunci boss.isAlive = true boss.x = 400 boss.y = -200 boss.health = 10 sfarsit - daca seful este in viata, atunci pastreaza evenimentul setat la 15 - acest lucru va impiedica ca celelalte evenimente sa se inmulteze daca (boss.isAlive == true) apoi inEvent = 15 altceva - tot aici ar trebui să fie același lucru ca înainte de check = math.random (100) dacă (bifați> 80 și bifați < 99) then inEvent = math.random(10) eventRun = 1 end if(check > 98), apoi inEvent = 11 eventRun = 2 sfârșit dacă (bifați> 72 și bifați < 81) then inEvent = 12 eventRun = 1 end if(check > 60 și verificați < 73) then inEvent = 13 eventRun = 1 end end

Nu ar trebui să fie ceva prea nebun acolo. Dacă sunteți nou în programare, este posibil să nu fiți familiarizat cu simbolul modulului:%. Ceea ce face este să luați numerele pe care le aveți și să împărțiți primul număr cu cel de-al doilea număr și să returnați restul. Deci, dacă scorul este de 15, scorul% 10 va reveni la 5, ceea ce nu este 0, deci nu va da naștere evenimentului sefului. Același lucru este valabil și pentru orice număr care nu este un multiplu de 10. Astfel putem controla cu ușurință rata de cât de des se produce ceva. Următorul pas va reveni în updateBlocks (). Chiar sub declarația if, care spune:

 if ((blocuri [a]). x < -40) then

Veți lua secțiunea scoreText și o veți pune în interiorul unei instrucțiuni if ​​care verifică dacă șeful este în viață sau nu (din nou nu vom actualiza scorul în timp ce el este în viață!) Ca parte a declarației if sunteți adăugând altceva care îi dă șefului un comportament). Faceți ca secțiunea să arate astfel:

 --actualizați scorul numai dacă șeful nu este în viață dacă (boss.isAlive == false) apoi scor = scor + 1 scorText.text = "scor:" ... scor scorText: setReferencePoint (display.CenterLeftReferencePoint) scoreText.x = 0 scorText. y = 30 altceva - au șuful de șept la fiecare trei blocuri trece boss.spitCycle = boss.spitCycle + 1 dacă (boss.y> 100 și boss.y < 300 and boss.spitCycle%3 == 0) then for a=1, bossSpits.numChildren, 1 do if(bossSpits[a].isAlive == false) then bossSpits[a].isAlive = true bossSpits[a].x = boss.x - 35 bossSpits[a].y = boss.y + 55 bossSpits[a].speed = math.random(5,10) break end end end end if(inEvent == 15) then groundLevel = groundMin end

Încă nimic nu prea groaznic, așa cum am spus că nu ar trebui să existe mult material nou de aici. Următoarea parte este mai mult decât aceeași și apoi am terminat. Următorul lucru pe care îl vom adăuga este verificările de detectare a coliziunii pentru a vedea ucide. Să începem cu explozia monstruului, trebuie să verificăm împotriva scuipatului șefului, precum și a monstrului în sine.

Adăugați aceste linii la funcția updateBlasts ():

 --(boss.isAlive == true) atunci dacă [blasts [a] .y - 25> boss.y - 120 și blasts [a] .y + 25 < boss.y + 120 and boss.x - 40 < blasts[a].x + 25 and boss.x + 40 > blasts [a] .x - 25), apoi blasts [a] .x = 800 blasts [a] .y = 500 blasts [a]. isAlive = false - totul este același numai 1 hit nu va ucide șeful așa a lua un pic de sanatate departe boss.health = boss.health - 1 end end - verifica pentru coliziuni intre exploziile si bossSpit pentru b = 1, bossSpits.numChildren, 1 do if (bossSpits [b] .isAlive == true) atunci dacă [blasts [a] .y - 20> bossSpits [y] .y - 120 și blasts [a] .y + 20 < bossSpits[b].y + 120 and bossSpits[b].x - 25 < blasts[a].x + 20 and bossSpits[b].x + 25 > [a] .x - 20), apoi blasturile [a] .x = 800 blasturi [a] .y = 500 blasturi [a] .isAlive = boss false [b] .x = 400 bossSpits [ bossSpits [b] .isAlive = șef falsSpitele [b] .speed = 0 end end end

Încă o detecție de coliziune pentru a merge și asta verifică scuipa șefului împotriva jucătorului nostru. Adăugați acest lucru la funcția checkCollisions ():

 --asigurați-vă că jucătorul nu a fost lovit de scuipatul șefului! pentru a = 1, bossSpits.numChildren, 1 dacă dacă (bossSpits [a] .isAlive == true) atunci dacă ((((((monster.y-bossSpits [a] .y))<45)) and ((  ((monster.y-bossSpits[a].y))>-45)) și ((((((monster.x-bossSpits [a] .x))> - 45))) - apoi opriți viteza monștrilor = 0 monster.isAlive = false - pauza () gameOver.x = display.contentWidth * .65 gameOver.y = display.contentHeight / 2 end end end

Din nou, asta ar trebui să pară destul de familiar. Ultimul lucru pe care trebuie să-l facem este să intrăm în funcția noastră de restartGame () și să-l actualizăm cu informațiile șefului împreună cu salivă lui.

De asemenea, rețineți că, deoarece am schimbat poziția monster.x în acest tutorial, este important ca în loc să resetați monster.x la 110, ar trebui să actualizăm acum monster.x pentru a reflecta noua sa poziție, care este de 60.

 --resetați șeful boss.isAlive = false boss.x = 300 boss.y = 550 - resetați scuipa șefului pentru a = 1, bossSpits.numChildren, 1 do bossSpits [a] .x = 400 bossSpits [a] .y = 550 bossSpits [a] .isAlive = sfârșitul fals

Salvați asta, rulați-o și bucurați-vă de noua adăugare a jocului! Ar trebui să te balansi așa:

și

Asa cum am spus de mai multe ori, intr-adevar nu a fost o multime de continut nebun nou, dar am crezut ca ar fi un exercitiu bun pentru a va arata cat de usor este sa va actualizati jocul cu continut nou. De asemenea, aceasta arată noi abordări pentru adăugarea de evenimente, astfel încât acestea sunt mai mult la cerere ca aleatoriu. Majoritatea acestor jocuri vor pune în aplicare, probabil, un amestec de ambele. Un bun exemplu de joc care face acest lucru este alergatorul bit.trip. Verificați-l pentru a vă simți bine ce se poate face cu acest stil de joc. Dacă am trece peste ceva prea repede și aveți întrebări, dați-mi voie să știu dacă nu vă pregătiți pentru a vă face jocul mai bine organizat data viitoare cu un nou sistem de meniu frumos care va face ca jocul să se simtă complet. Vă mulțumim că ați urmat și vă vom vedea data viitoare!

Cod