Lag et flykampspill i Corona Gameplay

Hva du skal skape

Introduksjon

I første del av denne serien klarte vi å få startskjermbildet og kunne overgå til gamelevel skjerm. I denne opplæringen fortsetter vi hvor vi igjen og begynner å implementere spillet.

1. Lokale variabler

Åpen gamelevel.lua, filen vi opprettet i den første opplæringen, og legg til følgende under linjen lokal scene = storyboard.newScene ().

Lokal spillerSpeedY = 0 lokal spillerSpeedX = 0 lokal spillerMoveSpeed ​​= 7 lokal spillerByte = 60 lokal spillerHeight = 48 lokal bulletWidth = 8 lokal bulletHeight = 19 lokal øyeHøyde = 81 lokal øyeBredde = 100 lokalnummerofEnemysToGenerate = 0 lokalt nummerOfEnemysGenerated = 0 lokal spillerBullets =  - - Holder alle kulene spilleren bryr lokal fiendeBullets =  - Hold kulene fra "alle" fiendtlige fly lokale øyer =  - Holder alle øyene lokalplanGrid =  - Holder 0 eller 1 (11 av dem for å lage et rutenett system) local enemyPlanes =  - Holder alle fiendens planer lokale livImages =  - Holder alle de "gratis liv" bildene lokalnummerOfLives = 3 lokale freeLifes =  - Holder all ingame gratis liv lokal spillerIsInvincible = falsk lokal gameOver = falskt lokalt nummerOfTicks = 0 - Et tall som økes hver ramme av spillet lokale islandGroup - En gruppe for å holde alle øyene lokalplanGruppe - En gruppe som holder alle flyene, kuler, osv. lokal s lag lokalplanSoundChannel - SoundChannel for flyet lyd lokal brannBladerBulletTimer lokal generereIslandTimer lokal fireEnemyBulletsTimer lokal generereFreeLifeTimer lokal rectUp - "opp" kontroll på DPAD lokal straightDown - "ned" kontroll på DPAD lokal rectLeft - "venstre" kontroll på DPAD lokal rectRight - "riktig" kontroll på DPAD

De fleste av disse er selvforklarende, men jeg har tatt med kommentarer til avklaring. Herfra skal all kode legges over linjen retur scene.

2. createScene

Begynn med å legge til createScene funksjon til main.lua. De createScene funksjonen kalles når scenens syn ikke eksisterer ennå. Vi legger til skjermobjektets spill i denne funksjonen.

funksjonsscene: createScene (event) lokal gruppe = self.view sluttscene: addEventListener ("createScene", scene)

3. setupBackground

funksjon oppsettBackground () lokal bakgrunn = display.newRect (0, 0, display.contentWidth, display.contentHeight) bakgrunn: setFillColor (0,0,1) scene.view: sett inn (bakgrunn) ende

I setupBackground, Vi lager en blå bakgrunn ved hjelp av Display-objektet newRect metode. De setFillColor Metoden tar RGB-verdier, som prosentandel. Invoke setupBackground fungere i createScene som vist under.

funksjonsscene: createScene (event) lokal gruppe = self.view setupBackground () ende

4. setupGroups

De setupGroups funksjonen instanserer islandGroup og planeGroup grupper, og legger dem inn i scenen utsikt. GroupObject er en spesiell type skjermobjekt der du kan legge til andre skjermobjekter. Det er viktig å først legge til islandGroup til utsikt for å sikre at øyene er under planene.

funksjon oppsettGrupper () islandGroup = display.newGroup () planeGroup = display.newGroup () scene.view: insert (islandGroup) scene.view: sett inn (flygruppe) ende

Invoke setupGroups fungere i createScene som vist under.

funksjonsscene: createScene (event) lokal gruppe = self.view setupBackground () setupGroups () end

5. setupDisplay

De setupDisplay funksjonen tegner et svart rektangel nederst på skjermen og innlegg dpad og fly bilder i utsikt.

funksjon setupDisplay () lokal tempRect = display.newRect (0, display.contentHeight-70, display.contentWidth, 124); tempRect: setFillColor (0,0,0); scene.view: sett inn (tempRect) lokal logo = display.newImage ("logo.png", display.contentWidth-139, display.contentHeight-70); scene.view: sett inn (logo) local dpad = display.newImage ("dpad.png", 10, display.contentHeight - 70) scene.view: sett inn

Igjen, påkall denne funksjonen i createScene som vist under.

funksjonsscene: createScene (event) lokal gruppe = self.view setupBackground () setupGroups () setupDisplay () end

6. setupPlayer

De setupPlayer funksjonen legger bare spillerens bilde til skjermen. Display-objektet kommer med to skrivebeskyttede egenskaper, contentWidth og contentHeight, som representerer den opprinnelige bredden og høyden på innholdet i piksler. Disse verdier som standard til skjermbredden og høyden, men kan ha andre verdier hvis du bruker innholdsskalering config.lua. Vi bruker disse egenskapene til å justere spilleren i scenen.

funksjon setupPlayer () player = display.newImage ("player.png", (display.contentWidth / 2) - (playerWidth / 2), (display.contentHeight - 70) -playerHeight) player.name = "Player" scene.view : Sett inn (spiller) slutt

Invoke setupPlayer fungere i createScene.

funksjonsscene: createScene (event) lokal gruppe = self.view setupBackground () setupGroups () setupDisplay () setupPlayer () end

7. setupLivesImages

De setupLivesImages funksjonen setter opp seks livsbilder og plasserer dem øverst til venstre på skjermen. Vi legger da inn bildene i livesImages bord, slik at vi senere kan referere dem. Til slutt sørger vi for at bare de tre første bildene er synlige.

funksjon setupLivesImages () for i = 1, 6 gjør lokal tempLifeImage = display.newImage ("life.png", 40 * i - 20, 10) table.insert (livesImages, tempLifeImage) scene.view: sett inn (tempLifeImage) jeg> 3) så tempLifeImage.isVisible = false; sluttendens ende

De setupLivesImages funksjonen er også påkalt i createScene funksjon.

funksjonsscene: createScene (event) lokal gruppe = self.view setupBackground () setupGroups () setupDisplay () setupPlayer () setupLivesImages () end

8. setupDPad

De setupDPad funksjonen setter opp de fire rektanglene rectUp, rectDown, rectLeft, og rectRight. Vi plasserer dem forsiktig på toppen av dpad-bildet, konfigurerer dem for ikke å være synlige, og kontroller at isHitTestable eiendommen er satt til ekte.

Hvis du angir visningsobjekter for ikke å være synlig, er du i utgangspunktet ikke i stand til å samhandle med dem. Men ved å sette inn isHitTestable eiendom til ekte, denne oppførselen er overstyrt.

funksjon setupDPad () rectUp = display.newRect (34, display.contentHeight-70, 23, 23) rectUp: setFillColor (1,0,0) rectUp.id = "opp" rectUp.isVisible = false; rectUp.isHitTestable = true; scene.view: sett inn (rectUp) rectDown = display.newRect (34, display.contentHeight-23, 23,23) rectDown: setFillColor (1,0,0) rectDown.id = "down" rectDown.isVisible = false; rectDown.isHitTestable = true; scene.view: sett inn (rectDown) rectLeft = display.newRect (10, display.contentHeight-47,23, 23) rectLeft: setFillColor (1,0,0) rectLeft.id = "left" rectLeft.isVisible = false; rectLeft.isHitTestable = true; scene.view: insert (rectLeft) rectRight = display.newRect (58, display.contentHeight-47, 23,23) rectRight: setFillColor (1,0,0) rectRight.id = "right" rectRight.isVisible = false; rectRight.isHitTestable = true; scene.view: Sett inn (rectRight) slutten

Du har gjettet det. Denne funksjonen er også påkalt i createScene.

funksjonsscene: createScene (event) lokal gruppe = self.view setupBackground () setupGroups () setupDisplay () setupPlayer () setupLivesImages () setupDPad () end

9. resetPlaneGrid

De resetPlaneGrid funksjonen nullstiller planeGrid bord og legger inn elleve nuller. De planeGrid Tabellen imiterer elleve punkter over x-aksen, der et fiendtlig plan kan plasseres. Dette vil gi mer mening når vi begynner å generere fiendtlige planer.

funksjon resetPlaneGrid () planeGrid =  for i = 1, 11 gjør table.insert (planeGrid, 0) endeenden

Oppgi denne funksjonen i createScene.

funksjonsscene: createScene (event) lokal gruppe = self.view setupBackground () setupGroups () setupDisplay () setupPlayer () setupLivesImages () setupDPad () resetPlaneGrid () end

10. enterScene

Nå som alle skjermobjektene er på plass, er det på tide å legge til hendelseslyttere, timere osv. Hvis du husker fra forrige del av denne opplæringen, enterScene funksjon er et bra sted å sette opp disse. Begynn med å sette inn følgende kodestykke.

funksjonsscene: enterScene (event) lokal gruppe = self.view ende scene: addEventListener ("enterScene", scene) 

11. Fjerne tidligere storyboard

Når vi går inn i denne scenen, må vi fjerne den forrige scenen. Legg til følgende kode i enterScene funksjon for å gjøre dette.

lokal tidligereScene = storyboard.getForrige () storyboard.removeScene (previousScene)
Når du går inn i en ny scene, kan den forrige scenen du var på refereres ved å ringe getPreviousstoryboard gjenstand. Vi fjerner det helt fra storyboardet ved å ringe removeScene på storyboard gjenstand.

12. Legg hendelseslyttere til Dpad-rektangler

Legg til følgende kode under koden du skrev inn i forrige trinn. Denne kodestykket legger til berøringslyttere til hver av rektanglene, og påberoper seg movePlane med hver berøring. La oss ta en titt på dette movePlane fungere i neste trinn.

rectEp: addEventListener ("touch", movePlane) rectDown: addEventListener ("touch", movePlane) rectLeft: addEventListener ("touch", movePlane) rectRight: addEventListener ("touch", movePlane)

1. 3. movePlane

De movePlane funksjonen er ansvarlig for å sette flyets hastighet. Vi kontrollerer om berøringsfasen er lik begynte, som betyr at spilleren har rørt ned, men ikke løftet fingeren opp igjen. Hvis dette er sant, setter vi fart og retning i henhold til hvilket rektangel som ble berørt. Hvis berøringshendelsens fase er lik endte, da vet vi at spilleren har løftet fingeren, noe som betyr at vi setter fart til 0.

funksjon movePlane (event) hvis event.phase == "startet" så hvis (event.target.id == "up") så spillerSpeedY = -playerMoveSpeed ​​avslutte hvis (event.target.id == "down") så spillerSpeedY = playerMoveSpeed ​​avslutte hvis (event.target.id == "left") så spillerenSpeedX = -playerMoveSpeed ​​hvis (event.target.id == "right") så spillerSpeedX = playerMoveSpeed ​​end elseif event.phase == "ended" then playerSpeedX = 0 playerSpeedY = 0 slutten

14. PlaneSound

La oss legge til litt lyd i spillet vårt. Legg til følgende kodestykke til enterScene funksjon. Det laster og spiller planesound.mp3. Ved å sette inn løkker eiendom til -1, lyden slår for alltid. Hvis du vil lære mer om lyd i Corona, må du sjekke dokumentasjonen.

lokalplanSound = audio.loadStream ("planesound.mp3") planeSoundChannel = audio.play (planetSound, loops = -1)

15. enterframe Begivenhet

Vi legger også til en kjøretidshendelse lytter som heter enterframe som vil ringe tilgameLoop funksjon. Frekvensen med hvilken enterframe hendelsen skjer avhenger av rammen per sekund (FPS) -verdien du angir config.lua. I vårt eksempel blir det kalt 30 ganger per sekund. Legg til denne hendelseslytteren i enterScene funksjon.

 Runtime: addEventListener ("enterFrame", gameLoop)

16. gameLoop

I gameLoop funksjon vi oppdaterer sprite posisjoner og utføre enhver annen logikk som må finne sted hver ramme. Hvis du er interessert i å lese mer om temaet spillspill, skrev Michael James Williams en flott artikkel som forklarer hvordan en felles spillsløype fungerer. Legg til følgende kodestykke.


funksjon gameLoop () movePlayer () slutten

17. movePlayer

De movePlayer funksjonen styrer flyttingen av spillerens plan. Vi flytter flyet i henhold til playerSpeedX og playerSpeedY verdier, som enten vil være 7 eller 0, avhengig av om spilleren berører DPad eller ikke. Se tilbake til movePlane Fungerer hvis dette er uklart. Vi kontrollerer også noen grenser, og sørger for at flyet ikke kan bevege seg utenfor skjermen.

funksjon movePlayer () player.x = player.x + playerSpeedX player.y = player.y + playerSpeedY if (player.x < 0) then player.x = 0 end if(player.x > display.contentWidth - playerWidth) så player.x = display.contentWidth - playerWidth avslutte hvis (player.y < 0) then player.y = 0 end if(player.y > display.contentHeight - 70-playerHeight) deretter player.y = display.contentHeight - 70 - playerHeight end-end 

Hvis du tester spillet nå, bør du kunne navigere flyet rundt skjermen ved hjelp av DPad.

Konklusjon

Dette bringer den andre opplæringen til denne serien til slutt. I neste utgave av denne serien fortsetter vi med spillingen. Takk for at du leser og ser deg der.