Lag en Space Invaders spillet i Corona: Ferdigstilling Gameplay

Create en Space Invaders spillet i Corona: Ferdigstilling Gameplay
24
Del
4
Del

Dette Cyber ​​mandag Envato Tuts + kurs vil bli redusert til bare $ 3. Ikke gå glipp av
Dette innlegget er en del av en serie som heter Opprett en Space Invaders spillet i Corona.Create et Space Invaders spillet i Corona. Implementering GameplayWhat du skal lage

I forrige del av denne serien fikk vi spillerens skipet beveger seg, fikk inntrengerne bevegelige, og oppdaget når en spiller kule hadde truffet en inntrenger. I denne siste delen av serien, vil vi få inntrengerne angripe spilleren, håndtere nivåer, og legge til muligheten for spilleren å dø.

1. Firing Bullets

Hver så ofte en av inntrengerne fyrer av en kule. Vi vil bruke en timer for å oppnå dette. Legg til følgende kode i gamelevel.lua
funksjon fireInvaderBullet () if (#invadersWhoCanFire > 0). Deretter lokal randomIndex = Math.random (#invadersWhoCanFire) lokal randomInvader = invadersWhoCanFire [randomIndex] lokal tempInvaderBullet = display.newImage (" laser.png ", randomInvader.x, randomInvader.y + invaderSize /2) tempInvaderBullet.name =" invaderBullet "scene.view: sett (tempInvaderBullet) physics.addBody (tempInvaderBullet," dynamisk ") tempInvaderBullet.gravityScale = 0 tempInvaderBullet.isBullet = sant tempInvaderBullet.isSensor = sant tempInvaderBullet: setLinearVelocity (0400) table.insert (invaderBullets, tempInvaderBullet) ellers levelComplete () end end

I denne funksjonen, vi først sjekke om den invadersWhoCanFire tabellen har minst ett element i den. Hvis det er tilfelle, så vi kjøre koden i hvis setningen. Ellers betyr det at nivået er over og vi påkalle levelComplete funksjonen.

Det vil alltid være minst én inntrenger som kan skyte en kule før du dreper den siste inntrenger, noe som medførte at invadersWhoCanFire tabellen vil være tom.

Inne hvis setningen, genererer vi et tilfeldig tall randomIndex avhengig av hvor mange elementer er i invadersWhoCanFire tabellen. Vi velger da dette elementet, randomInvader, fra invadersWhoCanFire bordet.

Vi skaper en kule image, gi den et navn eiendom slik at vi kan identifisere den senere, setter det inn på scenen, og sette de samme egenskapene som vi gjorde på spillerens bullet. Til slutt, vi setter kula inn i invaderBullets bordet slik at vi kan referere til den senere.

Vi trenger nå å sette opp timeren. Legg til følgende til scenen. Showet metode
funksjon scene: Vis (hendelse) if (fase == "gjorde") så --SNIP-- Spilletid: addEventListener ("kollisjon", onCollision) invaderFireTimer = timer.performWithDelay (1500, fireInvaderBullet, -1) Sluttslutt

Hver 1500 millisekunder fireInvaderBullet er påberopt. Legg merke til at den siste parameteren vi passere i er -1, som betyr timeren gjentar alltid. Når du oppretter en tidtaker som gjentar alltid, bør du til slutt avbryte den. Vi gjør dette i scenen: hide funksjon som vist nedenfor
funksjon scene. Hide (hendelse) if (fase == "vil") så --SNIP-- Spilletid: removeEventListener ("kollisjon", onCollision ) timer.cancel (invaderFireTimer) Sluttslutt
2. Fjerne Bullets

Som spillerens kuler, vil inntrengerne 'kuler flytte off-screen og være i bevegelse, tar opp verdifullt minne. For å bøte på dette, fjerner vi dem akkurat som vi gjorde med spillerens kuler
funksjons checkInvaderBulletsOutOfBounds () if (#invaderBullets > 0). Deretter for i = # invaderBullets, 1, -1 gjøre hvis (invaderBullets [i]. Y > display.contentHeight) så invaderBullets [i]: removeSelf () invaderBullets [i] = null table.remove (invaderBullets, i) end end Sluttslutt

Denne koden er svært lik sjekke om spillerens kuler er ute av grensene så jeg vil ikke diskutere gjennomføringen i detalj.

3. Oppdager en Hit

Trinn 1: Collision Detection

Det neste trinnet er å oppdage om en inntrenger kule har truffet spilleren. Legg til følgende kode i onCollision funksjonen.
Funksjon onCollision (hendelse) if (event.phase == "begynte") så --SNIP-- if (event.object1.name == "player" og event.object2.name == "invaderBullet") så table.remove (invaderBullets, table.indexOf (invaderBullets, event.object2)) event.object2: removeSelf () event.object2 = null if (playerIsInvincible == false) da killPlayer () end retur end if (event.object1.name == "invaderBullet" og event.object2.name == "player") så table.remove (invaderBullets, table.indexOf (invaderBullets, event.object1)) event.object1 : removeSelf () event.object1 = null if (playerIsInvincible == false) da killPlayer () end retur slutten Sluttslutt

Som før, vet vi ikke hva objektet event.object1 og event.object2 vil være slik at vi bruker to hvis utsagn for å sjekke begge situasjoner. Vi fjerner inntrengeren kule fra invaderBullets bordet, fjerne den fra displayet, og sett den til null. Hvis spilleren ikke er uovervinnelig, vi dreper det

Trinn 2:. Killing spilleren

Når vi drepe spilleren, vi gir ham en kort tid av uovervinnelighet. Dette gir brukeren tid til å gjenvinne fokus på spillet. Hvis numberOfLives variabelen er lik 0, vet vi at spillet er over, og overgangen til starten scene der brukeren kan starte et nytt spill
fungere killPlayer () numberOfLives = numberOfLives- en.; if (numberOfLives < = 0) så gameData.invaderNum = 1 composer.gotoScene ("start") annet playerIsInvincible = true spawnNewPlayer () Sluttslutt
Trinn 3: Gyte en New Player

spawnNewPlayer funksjonen gjør spilleren fade inn og ut i noen sekunder. Det er en fin effekt å la brukeren vite at skipet er midlertidig uovervinnelig
funksjon spawnNewPlayer () lokal numberOfTimesToFadePlayer = 5 lokale numberOfTimesPlayerHasFaded = 0 lokal funksjon fadePlayer () player.alpha = 0.; transition.to (spiller, {tid = 400, alfa = 1,}) numberOfTimesPlayerHasFaded = numberOfTimesPlayerHasFaded + 1 if (numberOfTimesPlayerHasFaded == numberOfTimesToFadePlayer) så playerIsInvincible = false end end fadePlayer () timer.performWithDelay (400, fadePlayer, numberOfTimesToFadePlayer) ende < p> Vi bruker en lokal funksjon, fadePlayer, som bruker overgangen biblioteket for å endre alfaverdien på spilleren. Vi holder styr på hvor mange ganger spilleren har falmet inn og ut, og sette spillerens uovervinnelighet til false når vi nå numberOfTimesToFadePlayer. Vi bruker en timer for å ringe fadePlayer funksjon for uansett hvor mange ganger numberOfTimesToFadePlayer er lik.

Kjør spill for å teste ut dette. Spilleren skal dø når en inntrenger kule treffer skipet. Hvis tre kuler traff skipet, bør du bli tatt til start scene hvor du kan starte et nytt spill.

For å gjøre dette enklere å teste, så kommenter bort kallet til moveInvaders i gameLoop funksjon som vist nedenfor.
funksjon gameLoop () checkPlayerBulletsOutOfBounds () --moveInvaders () checkInvaderBulletsOutOfBounds () end
4. Fullfører en Level

Hvis du har klart å drepe enhver inntrenger, spillet ville ha kalt levelComplete funksjonen, som ikke finnes ennå. La oss fikse det. . Legg til følgende kode blokken
funksjon levelComplete () gameData.invaderNum = gameData.invaderNum + 1 if (gameData.invaderNum < = gameData.maxLevels) så composer.gotoScene ("gameover") else gameData.invaderNum = 1 composer.gotoScene ("start") Sluttslutt

øke gameData.invaderNum, og hvis det er mindre enn gameData.maxLevels, vi overgangen til gameover scenen. Ellers har spilleren fullført hvert nivå, og vi null gameData.invaderNum til 1. Vi overgang til starten scene hvor spilleren kan starte et nytt spill.

En enkel måte å teste dette på er ved å kommentere ut kallet til moveInvaders i gameLoop funksjon og bruke knappene til å flytte skipet. Hvis det fortsatt er for hardt, så kan du også kommentere ut to samtaler til killPlayer i onCollision metoden.

5.
Lokal komponist = require ("komponist") lokale scenen = composer.newScene () lokal starFieldGenerator Game Over

Legg til følgende kode i gameover.lua å gjennomføre spillet over scenen. = Krever ("starfieldgenerator") lokale pulsatingText = require ("pulsatingtext") lokale nextLevelButtonlocal starGeneratorfunction scene: lage (hendelse) lokal gruppe = self.view starGenerator = starFieldGenerator.new (200, gruppe 5) lokale invadersText = pulsatingText.new ("LEVEL COMPLETE ", display.contentCenterX, display.contentCenterY-200," Conquest ", 20, gruppe) invadersText: SetColor (1, 1, 1) invadersText: pulsere () nextLevelButton = display.newImage (" next_level_btn.png ", displayet. contentCenterX, display.contentCenterY) gruppe: sett (nextLevelButton) endfunction scene: Vis (hendelse) lokal fase = event.phase composer.removeScene ("gamelevel") if (fase == "gjorde") så nextLevelButton: addEventListener ("tap" , startNewGame) Spilletid: addEventListener ("enterframe", starGenerator) endendfunction scene: hide (hendelse) lokal fase = event.phase if (fase == "vil") så Spilletid: removeEventListener ("enterframe", starGenerator) nextLevelButton: removeEventListener ( "tap", startNewGame) endendfunction startNewGame () composer.gotoScene ("gamelevel") endscene: addEventListener ("skape", scene) scenen: addEventListener ("show", scene) scenen: addEventListener ("skjule", scene) tilbake scene

Denne koden er svært lik starten scenen så du bør være kjent med det nå.

6. Kollidere med en inntrenger

Den siste kollisjonen sjekken vi trenger å utføre er en kollisjon mellom spilleren og på av inntrengerne. Legg til følgende kode blokken til onCollision metoden vi så tidligere.
Funksjon onCollision (hendelse) --SNIP-- if (event.phase == "begynte") så --SNIP-- if (event.object1.name == "spiller" og event.object2.name == "invader") så numberOfLives = 0 killPlayer () end if (event.object1.name == "inntrenger" og event.object2.name == "player") og deretter numberOfLives = 0 killPlayer () end end

Som vanlig må vi sjekke både kollisjonssituasjoner. Vi setter numberOfLives til 0 og ringe killPlayer. Ved å sette numberOfLives til 0 og påkalle killPlayer, er spillet over og spillet overganger til starten scene.

7. Flere funksjoner

Dette fullfører spillet vårt, men jeg foreslår at du prøver å utvide spillet med noen ekstra funksjoner. For eksempel kan du vise spillerens liv i en HUD.

Jeg har også tatt en UFO grafikk i kildefilene. Du kan prøve å lage en UFO tilfeldig vises og hvis spilleren treffer den med en kule gi dem et ekstra liv.

Hvis du trenger hjelp med disse begrepene, så sjekk ut min Plane slåssespill serien på Tuts +.


Konklusjon

Hvis du har fulgt denne serien, så bør du nå ha en fullt fungerende spill som ligner på de originale Space Invaders. Utvid på den og gjøre den til din egen. Jeg håper du fant denne opplæringen nyttig og har lært noen nye teknikker. Takk for at du leser.



Previous:
Next Page: