Vi har allerede kommet langt i å bygge vårt endeløse løpespill. På dette punktet i serien, bør du allerede ha en spillbar og hyggelig opplevelse, men denne opplæringen vil lære deg hvordan du legger til en ny vri: sjefslag!
I dag begynner vårt spill faktisk å se ut som et ekte spill! Vi har en kontrollerbar karakter med forskjellige typer hindringer som er tilfeldig generert, vi har parrallaxrulling implementert i tre forskjellige lag, og vi har et grunnleggende scoring system som gir våre spillere en følelse av prestasjon. Så langt så bra. Nå er dette kanskje nok for den typen spill du designer og dette er alt du trenger. Men la oss si at du vil krydre spillet med noe nytt. Noe som ... en sjefs kamp !!! Mens de fleste endeløse rullespill ikke har noen form for sjefs kamp, vil det være en god praksis å se på hvordan vi ville gå om å designe denne typen arrangement. Så, la oss komme i gang!
Du vil legge merke til at vi igjen følger samme format med en gammel mappe i vedlagte nedlastning som inneholder hele prosjektet som vi har opprettet så langt, og en ny mappe som inneholder prosjektet etter at vi har fullført denne opplæringen. Det første du må gjøre er å være sikker på at vi har bildene i riktig mappe. Du kan hente boss.png og bossSpit.png fra den nye mappen i vedlagte nedlastingsfilen. Legg merke til at sjefen ikke er animert, og er bare et enkelt bilde. Hvis du vil ha en animert sjef og glemte hvordan du animerer en sprite i Corona, se sprite animasjon opplæringen som ble utgitt tidligere i denne serien.
Nå som vi har de i samme mappe som vår main.lua-fil, gå videre og åpne main.lua i din favoritt tekstredigerer. Jeg kommer ikke til å forklare veldig mye om hva som foregår her (Husk å lese kommentarene for hint og små forklaringer!) Som vi har, snakket vi allerede om dette flere ganger, og jeg er sikker på at du bare ville hopp over det uansett. Dette vil også hjelpe oss med å komme gjennom opplæringen raskt som alt vi gjør her, har vi gjort før, så det er bare mange små endringer. Så la oss komme i gang.
Det første vi skal gjøre er å få bildene våre lastet inn i spillet. Igjen, dette bør alle se kjent ut. Legg til denne koden oppe der vi laster alle de andre bildene. Bare vær sikker på at bossSpits er erklært før du prøver å sette noe i det!
lokal sjef = display.newImage ("boss.png", 150, 150) boss.x = 300 boss.y = 550 boss.isAlive = false boss.health = 10 boss.goingDown = sann boss.canShoot = false --spitCycle er det eneste som ikke er selvutforskende - hver gang vi flytter et bakstykke tilbake til høyre for skjermen - oppdaterer vi poengsummen for en. Nå oppdaterer vi også -spite syklusen. Hver gang spitCycle er et flertall av tre - vil sjefen skyte sitt prosjektil. Dette holder bare spor - av det for oss! boss.spitCycle = 0 for a = 1, 3, 1 gjør bossSpit = display.newImage ("bossSpit.png") bossSpit.x = 400 bossSpit.y = 550 bossSpit.isAlive = false bossSpit.speed = 3 bossSpits: insert sjefspit) ende
Så vær sikker på å legge dem inn på skjermen ved siden av de andre tilleggene, et godt sted å sette dem ville være rett før du setter inn kollisjonen Rect.
skjerm: sett inn (sjef) skjerm: sett inn (bossspits)
Lagre det og kjør det. Gå videre og sjekk det ut i iPhone 4-versjonen, og du bør se noe slikt:
La oss få dem til å gjøre noe. Måten vi skal håndtere sjefen på, er at det tilfeldigvis kommer inn i spillet som de andre hendelsene vi ønsker at dette skal skje på et bestemt tidspunkt. For dette eksempelet skal vi sette det til et lavt antall, så det kommer raskt til hendelse, men du vil nok gjøre det til en mer fornuftig tid i spillet ditt. Så, hva som vil skje er hver gang monsteret ditt må løpe en avstand som er lik et flertall på 10. Sjefen vil gyte. Når vi gyter sjefen, får vi grunnen til å bli flatt på bakken. Vi stopper også spøkelser og spikevegger fra gyting på den måten, det er ikke forstyrrelser fra kampen! Når han går, kommer han inn i scenen fra toppen og begynner å boble opp og ned mens du spytter varme som søker gule baller ... av døden!
Så, som sjefen skyter på spilleren, må spilleren drepe sjefen ved å skyte ham ti ganger. Spilleren kan også forsvare seg fra spytten ved å skyte dem. Så den grunnleggende strategien for å vinne kommer til å hoppe og spamming hans skyteferdighet! Et par andre ting å merke seg er at i dette spillet bestemte jeg meg for å ikke oppdatere poenget mens sjefen er i live, slik at spilleren blir tvunget til å beseire sjefen for å fortsette å få høyere poeng. Den siste tingen før vi går videre er at jeg har sjefen satt for å skyte et skudd hver tre blokkoppdateringer. Dette har igjen den fordelen at vanskeligheten automatisk skalerer med spillet. Det gir også en enkel måte å få konsekvente skud av. Ingenting er gal, men generelt legger det til en fin vri på spillet.
For å få mer plass til sjefen på skjermen flyttet jeg spilleren litt lenger tilbake på skjermen. Jeg starter nå helten som:
monster.x = 60
Dette vil åpne opp nivået litt. Den neste tingen vi bør gjøre er å gå videre og plop våre funksjoner som vil oppdatere sjefen og sjefens spytte:
funksjonsoppdateringBoss () - kontroller at sjefen ikke har blitt drept hvis (boss.health> 0) da - kontroller for å se om sjefen må bytte retning hvis (boss.y> 210) deretter sjef. goingDown = false end hvis (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) then bossSpits [a] .y = bossSpits [a] .y - 1 ende hvis (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
Med de der inne trenger vi bare å gjøre noen tilpasninger til noen av våre andre funksjoner og legge dem til vår oppdatering () -funksjon:
updateBossSpit () hvis (boss.isAlive == true) og updateBoss () end
Legg til de i oppdateringsfunksjonen, og gå til funksjonen checkEvent () og hvor du ser koden som ser slik ut:
hvis (inEvent> 0 og eventRun> 0) så - Ikke noe annet
Rett under det andre erklæringen tømte alt som var der inne og endret det til dette:
--Det er her vi setter sjefen etter hver 10 blokker - også kontroller sjefens helse herfra hvis (boss.isAlive == falsk og score% 10 == 0) da boss.isAlive = true boss.x = 400 boss.y = -200 boss.health = 10 ende - hvis sjefen er i live, hold så hendelsen satt til 15 - dette vil forhindre at de andre hendelsene gyser hvis (boss.isAlive == sant) så inEvent = 15 annet - alt her nede skal være det samme som det var før sjekk = math.random (100) hvis (sjekk> 80 og sjekk < 99) then inEvent = math.random(10) eventRun = 1 end if(check > 98) deretter inEvent = 11 eventRun = 2 ende hvis (sjekk> 72 og sjekk < 81) then inEvent = 12 eventRun = 1 end if(check > 60 og sjekk < 73) then inEvent = 13 eventRun = 1 end end
Det bør ikke være noe så gal der inne. Hvis du er ny til programmering, er du kanskje ikke kjent med modulusymbolet:%. Hva dette gjør er å ta det tallet du har og dele det første nummeret med det andre nummeret og returnerer resten. Så, hvis poengsummen er 15, vil score% 10 returnere 5, som ikke er 0, så det vil ikke gyte sjefsbegivenheten. Det samme gjelder for et tall som ikke er et flertall på 10. Det er slik at vi enkelt kan styre frekvensen av hvor ofte noe gyter. Det neste trinnet kommer til å være tilbake i updateBlocks (). Rett under if-setningen som sier:
if ((blokkene [a]). x < -40) then
Du skal ta partituret score og sette det inn i en if-setning som kontrollerer for å se om sjefen er i live eller ikke (igjen skal vi ikke oppdatere poenget mens han lever! Som en del av if-setningen er du kommer til å legge til et annet som gir sjefen noen av hans oppførsel). Gjør at delen ser slik ut:
--bare oppdatere poenget hvis sjefen ikke er i live hvis (boss.isAlive == false) så score = score + 1 scoreText.text = "score:" ... score scoreText: setReferencePoint (display.CenterLeftReferencePoint) scoreText.x = 0 scoreText. y = 30 annet - ha sjefen spytte hver tre blokk passerer boss.spitCycle = boss.spitCycle + 1 hvis (boss.y> 100 og 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
Fortsatt ingenting for veldig hardt, som jeg sa at det ikke burde være mye nytt materiale herfra. Den neste delen er bare mer av det samme, og så er vi ferdige. Den neste tingen vi skal legge til er kollisjonsdeteksjonskontrollene for å se dreper. La oss starte med monsterets eksplosjon, vi må sjekke mot sjefens spytt samt selve monsteret.
Legg til disse linjene i funksjonen updateBlasts ():
--sjekk for kollisjoner med sjefen hvis (boss.isAlive == true) så hvis (blasts [a] .y - 25> boss.y - 120 og blasts [a] .y + 25 < boss.y + 120 and boss.x - 40 < blasts[a].x + 25 and boss.x + 40 > blaster [a] .x - 25) så blaster [a] .x = 800 blasts [a] .y = 500 blasts [a] .isAlive = false - alt er det samme bare 1 hit vil ikke drepe sjefen så bare ta en liten helse unna bossen.health = boss.health - 1 ende ende - kontroller for kollisjoner mellom blastene og sjefenSpit for b = 1, bossSpits.numChildren, 1 gjør hvis (bossSpits [b] .isAlive == true) så hvis (blasts [a] .y - 20> bossSpits [b] .y - 120 og blasts [a] .y + 20 < bossSpits[b].y + 120 and bossSpits[b].x - 25 < blasts[a].x + 20 and bossSpits[b].x + 25 > blaster [a] .x - 20) så blaster [a] .x = 800 blasts [a] .y = 500 blasts [a] .isAlive = false bossSpits [b] .x = 400 bossSpits [b] .y = 550 bossSpits [b] .isAlive = false bossSpits [b] .speed = 0 endeendens ende
En ekstra kollisjonsdeteksjon å gå, og det er å sjekke sjefens spytt mot vår spiller. Legg til dette i funksjonen checkCollisions ():
--sørg for at spilleren ikke ble rammet av sjefens spytt! for a = 1, bossSpits.numChildren, 1 gjør hvis (bossSpits [a] .isAlive == true) så hvis (((((monster.y-bossSpits [a] .y))<45)) and (( ((monster.y-bossSpits[a].y))>-45)) og - (monster.x-bossSpits [a] .x))> - 45))) - deretter stopp monsterhastigheten = 0 monster.isAlive = false - dette pause bare det nåværende animasjonsmonstret: pause () gameOver.x = display.contentWidth * .65 gameOver.y = display.contentHeight / 2 endeendens ende
Igjen det burde alle se ganske kjent ut. Det siste vi må gjøre er å gå inn i vår restartGame () -funksjon og oppdatere den med sjefens informasjon sammen med spytten hans.
Vær også oppmerksom på at fordi vi endret posisjonen monster.x i denne opplæringen, er det viktig at vi i stedet for å tilbakestille monster.x til 110, skal oppdatere monster.x for å gjenspeile sin nye posisjon, som er 60.
--tilbakestill sjefen boss.isAlive = false boss.x = 300 boss.y = 550 - tilbakestill sjefens spytt for a = 1, sjefspiller.numChildren, 1 do bossSpits [a] .x = 400 bossSpits [a] .y = 550 bossSpits [a] .isAlive = false end
Lagre det, løp det, og nyt det nye tillegget til spillet! Du burde være å rocke noe sånt nå:
og
Som jeg sa flere ganger, var det egentlig ikke mye gal nytt innhold, men jeg trodde det ville være en god øvelse å vise deg hvor lett det er å oppdatere spillet ditt med nytt innhold. Det viser også nye tilnærminger til å legge til hendelser, slik at de er mer på forespørsel som tilfeldig. De fleste av disse typer spill vil trolig implementere en blanding av begge. Et godt eksempel på et spill som gjør dette bra er bit.trip runner. Sjekk det ut for å få en god følelse for hva som kan gjøres med denne spillstilen. Hvis vi gikk over noe for fort og du har noen spørsmål, gi meg beskjed, hvis ikke gjør deg klar til å få vårt spill litt bedre organisert neste gang med et fint nytt menysystem som vil gjøre dette spillet fullstendig. Takk for at du følger med, og vi får se deg neste gang!