Bygg et Endless Runner-spill fra scratch Game Over & Scoring

I denne opplæringen lager vi to nye funksjoner som virkelig vil legge til litt skinn i spillet vårt: scoring og spill over. Det kan høres ut som mye arbeid, men vårt spill er satt opp for å gjøre dette raskt og enkelt å gjøre. Så, la oss få de funksjonene der inne og fullføre vårt spill!

Den første funksjonen vi skal takle er scoring-systemet. For å få et godt scoring system på plass, må vi legge til litt visuelt tiltalende tekst til spillet vårt. Du kan starte med å laste ned en ny skrifttype du velger, eller ved å laste ned den jeg har tatt med i denne opplærings nedlastingsfilen. Hvis du velger din egen, må du være sikker på at du laster ned en ".ttf" -fil. Det er mange flotte nettsteder tilgjengelig med gratis fonter; du kan begynne med å bare søke etter "gratis fonter" og bla til du finner noe du liker. Nedlastingsfilen er opprettet på samme måte som i de foregående prosjektene. Det er en gammel og en ny mappe: Den gamle mappen inneholder alt vi har gjort opp til nå, og den nye mappen inneholder prosjektet slik det vil se på slutten av denne opplæringen.

Når du har det i mappen som inneholder din main.lua-fil, fortsett og åpne både main.lua-filen og din build.settings-filen, og la oss få det til å fungere. Det første vi skal gjøre er å jobbe med vår build.settings-fil. Det er herfra at vi skal la programmet vite at de skal inneholde den egendefinerte skrifttypen.

Endre filen build.settings for å se slik ut:

 settings = orientation = default = "landscapeRight", content = "landscapeRight", støttet = "landscapeRight",, --adder fonten BorisBlackBloxx.ttf til vårt spill - du må fortsatt referere til navnet i kodeksen, men hvis du ikke har det referert her, vil det ikke fungere iphone = plist = UIAppFonts = "BorisBlackBloxx.ttf",,

Vær oppmerksom på at dette vil være det samme selv om du har en Android-enhet. Jeg er hovedsakelig en iOS-utvikler når det gjelder spillutvikling, så jeg har ikke testet dette på en Android-enhet. Dette nøyaktige skriptet skal imidlertid fungere på Android-enheten din, så vel som iOS-enheten din. (Hvis noen Android-brukere som går over denne opplæringen støter på problemer, vennligst gi meg beskjed, og jeg vil se nærmere på det!) Nå som koden ovenfor er på plass, kan du fortsette og lukke den filen, da vi ikke trenger å røre den noe mer. Vi vil bekrefte at det virket ved å legge til litt tekst i spillet.

La oss åpne vår main.lua-fil og gi våre spillere et scoring system! Rett over hvor vi lager våre visningsgrupper, sett inn følgende:

 --variabel for å holde vårt spills poengsum lokale score = 0 - scoreText er en annen variabel som har en streng som har poenginformasjonen - når vi oppdaterer poengsummen, må vi alltid oppdatere denne strengen også - ***** Note for android brukere, kan det hende du må inkludere filtypen for skrifttypen - som du velger her, så det ville være BorisBlackBloxx.ttf der ****** local scoreText = display.newText ("score:" ... score, 0, 0, "BorisBlackBloxx", 50) - Dette er viktig, fordi hvis du ikke har denne linjen, vil teksten hele tiden holde seg - istedenfor å justere seg pent sammen med et fast punkt scoreText: setReferencePoint (display.CenterLeftReferencePoint) scoreText .x = 0 scoreText.y = 30

Den neste tingen vi skal gjøre er å legge den til på vår skjermbilde. Sett dette etter at alle de andre gruppene er lagt til i skjermgruppen:

 skjerm: innsats (scoreText)

Fortsett og kjør det. Dette skal gå veldig fort, så vær sikker på at alt fungerer riktig før du går videre. Du bør se noe slikt:

Når du har testet det for å sikre at det fungerer, oppdaterer vi poengsummen slik at det har umiddelbar verdi i spillet vårt. I updateBlocks () funksjonen er det rett under linjen som sier:

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

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

Dette vil bare oppdatere poengsummen vår med ett punkt hver gang en blokk går fra venstre side av skjermen og settes inn på nytt til høyre. Dette kan selvfølgelig brukes på mange forskjellige måter. Det er en smart idé å oppdatere poengsummen her fordi den vil holde den konsekvent i alle spill. Det baserer resultatene på hvor langt spillerne har reist. Faktisk, hvis du ønsket å registrere hvor langt de har reist, ville du bare lagre poenget i variablen som kalles distanceTraveled, meter eller noe som ligner det.

Den neste funksjonen vi tar tak i, adresserer hva som skjer når en spiller dør. Vi vil holde det enkelt i denne opplæringen, men du bør kunne se hvordan du kan innlemme mer inn i dette når vi er ferdige. Husk at å legge til poengsummen er veldig ganske enkelt å gjøre. La oss si at du ønsket å få poengene å øke med fem hver gang du dreper et spøkelse eller et hinder. Du vil bare sette koden ovenfor i kollisjonsseksjonsseksjonen der du ødelegger de nevnte objektene.

Når vår karakter dør, skal vi gjøre flere ting:

1) Stopp spillerenes bevegelse.

2) Gjør spilleren spinn i sirkler for dramatisk effekt. Vi gjør dette her fordi jeg bare vil vise deg rotasjonsfunksjonen for skjermobjekter. Du kan selvfølgelig forandre sin død til hva du vil at den skal være.

3) Vis en skjerm over spillet som lar spilleren starte spillet på nytt hvis de velger det.

Først må vi sørge for at spillhastigheten er satt til 0. Deretter må vi legge til en variabel til vårt monster-skjermobjekt. Gjør dette ved å legge til følgende linje kode hvor vi instantierer monster:

 monster.isAlive = true

Med det på plass vil vi sjekke statusen på et par forskjellige steder i spillet. Den første endringen vi skal gjøre er å oppdatereMonster (), gå videre og gjør updateMonster () se slik ut:

 funksjonoppdateringMonster () - om vårt monster hopper og bytt til hoppingsanimasjonen - ikke fortsett å spille animasjonen hvis (monster.isAlive == true) så hvis (onGround) så hvis (varOnGround) så annet monster: lagre monster: play () end hvis (monster.accel> 0) så monster.accel = monster.accel - 1 ende monster.y = monster .y - monster.accel monster.y = monster.y - monster.gravity annet monster: roter (5) ende - oppdatere kollisjonenRekt å holde seg foran monsterkollisjonenRect.y = monster.y-enden

Legg merke til at før vi oppdaterer monsterns posisjon, kontrollerer vi først for å se om spilleren er i live eller ikke. Hvis spilleren er i live, fortsetter vi ganske enkelt som vi normalt ville. Hvis spilleren ikke er i live, sender vi vårt monster til en endeløs spinn. Deretter må vi faktisk endre monster.isAlive status. Gå til funksjonen checkCollisions (), og vi gjør endringene. Innenfor kontrollkollisjonene er vårt monsters posisjon kontrollert mot 3 forskjellige gjenstander for kollisjoner: blokker, spøkelser og pigger. I hver av disse seksjonene stiller vi hastigheten til spillet til 0 når en collsion blir oppdaget. Hva du trenger å gjøre nå, er å legge til denne koden til hver av de tre seksjonene like etter at vi har satt hastigheten til 0.

 monster.isAlive = false - dette pause bare det nåværende animasjonsmonstret: pause ()

Nå er det satt slik at hva som helst animasjon spiller vil stoppe når du dør. Dessuten vil monsteret rotere på plass på grunn av koden vi allerede har lagt til i UpdateMonster (). Kjør spillet igjen, og du bør se dette:

På dette punktet har vi to av de tre tingene vi trengte for å gjøre dødsprosessen bedre i vårt spill. Det siste er å lage en liten dødsskjerm som lar spilleren starte spillet om de velger. Gå tilbake til toppen av filen der vi legger til alle displayObjects og legg til dette:

 lokal gameOver = display.newImage ("gameOver.png") gameOver.name = "gameOver" gameOver.x = 0 gameOver.y = 500

Fordi dette er en enkel meny, gikk jeg videre og gjorde det til et stort bilde. Jeg brukte den samme metoden som vi har gjort for resten av bildene, og lagret den på skjermen for senere bruk. Nå må vi flytte dette på skjermen hver gang spilleren dør. Gå tilbake til delen av koden vi nettopp har jobbet med der vi angir monster.isAlive = false. Rett under det legger du til følgende for hver av disse seksjonene:

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

Husk å legge til

 skjerm: innsats (game)

til koden din slik at gameOver vises riktig. Sett det som den siste tingen å legge til rett etter tekstScore. På den måten er det sikkert å være synlig når vi flytter den.

Dette vil sette skjermbildet "Game Over" til høyre for det roterende monsteret, slik at vi fortsatt kan se vår endelige poengsum i øverste venstre side av skjermen. Til slutt, for alt dette skal fungere, må vi gjøre det faktisk gjøre noe når vi berører det. Så neste vi vil redigere er den berørte () -funksjonen. Endre berørt funksjon for å se slik ut:

 funksjon berørt (hendelse) hvis (event.x < gameOver.x + 150 and event.x > gameOver.x - 150 og event.y < gameOver.y + 95 and event.y > gameOver.y - 95) og start deretter om (monster.isAlive == true) så hvis (event.phase == "startet") så hvis (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

Legg merke til at vi bare gjorde en endring til dette: I stedet for å først sjekke for å se hvilken side av skjermen kontakten er på (hvordan vi bestemmer hopp eller brann), kontrollerer vi for å se om spilletOverdisplay-objektet ble rørt. Hvis det ikke ble rørt og monsteret lever, fortsett å hoppe og skyte som normalt. Men hvis gameOver ble rørt, betyr det at spillet er over, fordi det er nå synlig, og vi kaller bare funksjonen restartGame (). Et sted over det legger til funksjonen restartGame () og det vil gjøre alt for oss.

 funksjon restartGame () --move meny gameOver.x = 0 gameOver.y = 500 --Gjør poengsummen = 0 --Gjør spillet hastighet hastighet = 5 --Gjør monster monster.isAlive = Sant monster.x = 110 monster.y = 200 monster: prepare ("running") monster: play () monster.rotation = 0 - resett grunnlagetLevel groundLevel = groundMin for a = 1, blocks.numChildren, 1 blokkere [a] .x = ( a * 79) - 79 blokker [a] .y = groundLevel endre - reser spøkelsene for a = 1, ghosts.numChildren, 1 gjør spøkelser [a] .x = 800 spøkelser [a] .y = 600 end - tilbakestill pigger for a = 1, spikes.numChildren, 1 gjør pigger [a] .x = 900 pigger [a] .y = 500 end - resett blastene for a = 1, blasts.numChildren, 1 blasts [a ] .x = 800 blaster [a] .y = 500 end - reser bakgrunnene backgroundfar.x = 480 backgroundfar.y = 160 backgroundnear1.x = 240 backgroundnear1.y = 160 backgroundnear2.x = 760 backgroundnear2.y = 160 end

Kjør det og forhåpentligvis burde du nå ha en liten funksjon dødskjerm som du kan berøre for å starte spillet på nytt.

Med de små endringene på plass skal vi nå ha et fullt funksjonelt spill! Spilleren tjener en poengsum og vi håndterer døden litt mer grasiøst. Alt vi gjorde her var veldig enkelt, men forhåpentligvis nå har du en ide om hvordan du kan opprette større menyer eller hvordan du kan gjøre en mer innviklet dødscene når du dør. En enkel måte ville ganske enkelt være å legge til et par nye animasjoner som passer til de forskjellige dødsfallene, men jeg vil la deg bestemme hva som passer best for ditt spill. Hvis du har spørsmål om endringene vi har gjort, vennligst gi meg beskjed i kommentarene. Takk for at du følger med!