Creați un joc de combatere a avioanelor în Corona Gameplay

Ce veți crea

Introducere

În prima parte a acestei serii, am reușit să afișăm ecranul de pornire și am reușit să trecem la gamelevel ecran. În acest tutorial, vom continua de unde am plecat și vom începe să implementăm modul de joc.

1. Variabile locale

Deschis gamelevel.lua, fișierul pe care l-am creat în primul tutorial și adăugați următoarele sub linie scena local = storyboard.newScene ().

jucator localSpeedY = 0 jucator localSpeedX = 0 jucator localMoveSpeed ​​= 7 jucator localWidth = 60 jucator localHeight = 48 local bulletWidth = 8 local bulletHeight = 19 insula localaHeight = 81 insula localaWidth = 100 local numberofEnemysToGenerate = 0 numar localOfEnemysGenerated = 0 local playerBullets =  - Păstrează toate gloanțele pe care playerul le aprinde pe inamicul localBullets = - Ține gloanțele de la "toate" avioanele inamice insulele locale = - Ține toate insulele planului localGrid =  - Ține 0 sau 1 (11 dintre ele pentru a face un sistem de rețea), inamic localPlanes =  - Ține toate avioanele inamice vieți localeImages =  - Ține toate imaginile "vieții libere" număr localOfLives = 3 local freeLifes =  - Ține toate jocurile free life local playerIsInvincible = joc local fals Over = numar local falsOfTicks = 0 - un numar care este incrementat in fiecare rama a jocului local islandGroup - un grup care detine toate insulele locale planeGrup - un grup care detine toate avioanele, gloanțe etc. locale p nivel plan localSoundChannel - SoundChannel pentru planul de zgomot local firePlayerBulletTimer local generateIslandTimer foc localEnemyBulletsTimer local generateFreeLifeTimer local rectUp - Controlul "sus" pe rețeaua locală DPAD - Controlul "în jos" pe rectLeft locale DPAD - "stânga" controlul asupra rectDight local DPAD - Controlul "dreapta" pe DPAD

Cele mai multe dintre acestea sunt explicative, dar am inclus comentarii pentru clarificare. De aici, toate codurile trebuie inserate deasupra liniei întoarceți scena.

2. createScene

Începeți prin adăugarea funcției createScene funcția pentru a main.luacreateScene este apelată când vizualizarea scenei nu există încă. Vom adăuga obiectele de afișare ale jocului în această funcție.

funcția scena: createScene (eveniment) grup local = auto.view scena finală: addEventListener ("createScene", scenă)

3. setupBackground

funcția setupBackground () local background = display.newRect (0, 0, display.contentWidth, display.contentHeight) fundal: setFillColor (0,0,1) scene.view: inserare (fundal)

În setupBackground, noi creăm un fundal albastru folosind obiectul Display newRect metodă. setFillColor metoda ia valorile RGB, ca procente. Invocați setupBackground funcția în createScene așa cum se arată mai jos.

scena funcției: createScene (eveniment) grup local = auto.view setupBackground () sfârșit

4. setupGroups

setupGroups funcția instanțiată islandGroup și planeGroup grupuri și le inserează în scena vedere. GroupObject este un tip special de obiect de afișare în care puteți adăuga alte obiecte de afișare. Este important să adăugați mai întâi islandGroup la vedere pentru a vă asigura că insulele sunt sub planuri.

funcția setupGroups () islandGroup = display.newGroup () planeGroup = display.newGroup () scene.view: inserați (islandGroup) scene.view: inserați (planeGroup) end

Invocați setupGroups funcția în createScene așa cum se arată mai jos.

funcția scena: createScene (eveniment) grupul local = self.view setupBackground () setupGroups () end

5. setupDisplay

setupDisplay funcția trage un dreptunghi negru în partea de jos a ecranului și se inserează dpad și avion imagini în vedere.

funcția setupDisplay () local tempRect = display.newRect (0, display.contentHeight-70, display.contentWidth, 124); tempRect: setFillColor (0,0,0); scene.view: inserați (tempRect) logo-ul local = display.newImage ("logo.png", display.contentWidth-139, display.contentHeight-70); scene.view: inserați (logo) local dpad = display.newImage ("dpad.png", 10, display.contentHeight - 70) scene.view: inserați (dpad)

Din nou, invoca această funcție în createScene așa cum se arată mai jos.

funcția scena: createScene (eveniment) grup local = self.view setupBackground () setupGroups () setupDisplay () sfârșit

6. setupPlayer

setupPlayer Funcția adaugă pur și simplu imaginea player-ului pe ecran. Obiectul Display are două proprietăți read-only, contentWidth și contentHeight, reprezentând lățimea și înălțimea inițială a conținutului în pixeli. Aceste valori implicite la lățimea și înălțimea ecranului, dar pot avea alte valori dacă utilizați scalarea conținutului config.lua. Utilizăm aceste proprietăți pentru alinierea player-ului în scenă.

funcția setupPlayer () player = display.newImage ("player.png", (display.contentWidth / 2) - (playerWidth / 2), (display.contentHeight - 70) -playerHeight) player.name = "Player" : introduceți (player) sfârșitul

Invocați setupPlayer funcția în createScene.

funcția scena: createScene (eveniment) grupul local = self.view setupBackground () setupGroups () setupDisplay () setupPlayer () sfârșitul

7. setupLivesImages

setupLivesImages funcția stabilește șase imagini de viață și le poziționează în partea stângă sus a ecranului. Apoi inserăm aceste imagini în livesImages tabel, astfel încât să putem să le menționăm mai târziu. În cele din urmă, ne asigurăm că numai primele trei imagini sunt vizibile.

Funcția setupLivesImages () pentru i = 1, 6 face tempLifeImage local = display.newImage ("life.png", 40 * i - 20, 10) table.insert (livesImages, tempLifeImage) i> 3) apoi tempLifeImage.isVisible = false; sfârșitul capătului final

setupLivesImages este invocată și în createScene funcţie.

funcția scena: createScene (eveniment) grupul local = self.view setupBackground () setupGroups () setupDisplay () setupPlayer ()

8. setupDPad

setupDPad funcția stabilește cele patru dreptunghiuri rectUp, rectDown, rectLeft, și rectRight. Poziționăm cu atenție ele în partea de sus a imaginii dpad, configurați-le să nu fie vizibile și asigurați-vă că isHitTestable proprietatea este setată la Adevărat.

Dacă setați obiectele de afișare să nu fie vizibile, inițial nu puteți interacționa cu ele. Cu toate acestea, prin setarea isHitTestable proprietate la Adevărat, acest comportament este suprasolicitat.

funcția setupPad () rectUp = display.newRect (34, display.contentHeight-70, 23, 23) rectUp: setFillColor (1,0,0) rectUp.id = "sus" rectUp.isVisible = false; rectUp.isHitTestable = adevărat; scene.view: inserați (rectUp) rectDown = display.newRect (34, display.contentHeight-23, 23,23) rectDown: setFillColor (1,0,0) rectDown.id = "jos" rectDown.isVisible = false; rectDown.isHitTestable = adevărat; scene.view: inserare (rectDown) rectLeft = display.newRect (10, display.contentHeight-47,23,23) rectLeft: setFillColor (1,0,0) rectLeft.id = "stânga" rectLeft.isVisible = false; rectLeft.isHitTestable = adevărat; scene.view: inserați (rectLeft) rectRight = display.newRect (58, display.contentHeight-47, 23,23) rectRight: setFillColor (1,0,0) rectRight.id = "dreapta" rectRight.isVisible = false; rectRight.isHitTestable = adevărat; scene.view: introduceți (rectRight) sfârșitul

Ai ghicit-o. Această funcție este invocată și în createScene.

funcția scena: createScene (eveniment) grupul local = self.view setupBackground () setupGroups () setupDisplay () setupPlayer () setupLivesImages

9. resetPlaneGrid

resetPlaneGrid funcția resetează planeGrid masă și introduceți unsprezece zerouri. planeGrid masa imită 11 puncte pe axa x, în care poate fi poziționat un plan inamic. Acest lucru va avea mai mult sens când vom începe să generăm avioane inamice.

funcția resetPlaneGrid () planeGrid =  pentru i = 1, 11 face table.insert (planeGrid, 0) end end

Invocați această funcție în createScene.

() setareDisplay () setupPlayer

10. enterScene

Acum că toate obiectele de afișare sunt în loc, este timpul să adăugați ascultători de evenimente, cronometre etc. Dacă vă amintiți din partea anterioară a acestui tutorial, enterScene funcția este un loc bun pentru a le seta. Începeți prin introducerea următorului fragment de cod.

scena funcției: enterScene (eveniment) grup local = auto.view scena finală: addEventListener ("enterScene", scenă) 

11. Înlăturarea Storyboardului precedent

Când intrăm în această scenă, trebuie să eliminăm scena anterioară. Adăugați următorul cod la enterScene funcția de a face acest lucru.

local previousScene = storyboard.getPrevious () storyboard.removeScene (anteriorScene)
Când introduceți o scenă nouă, scena anterioară la care ați participat poate fi menționată prin apelare getPrevious pe storyboard obiect. Îl îndepărtăm complet de pe tabloul de bord apelând removeScene pe storyboard obiect.

12. Adăugați ascultători de evenimente în dreptunghiuri Dpad

Adăugați următorul cod sub codul pe care l-ați introdus în pasul anterior. Acest fragment de cod adaugă ascultători de atingere fiecărui dreptunghi, invocând movePlane cu fiecare atingere. Să aruncăm o privire la asta movePlane în etapa următoare.

rectUp: addEventListener ("atingeți", movePlane) rectDown: addEventListener ("atingeți", movePlane) rectLeft: addEventListener

13. movePlane

movePlane funcția este responsabilă pentru setarea vitezei avionului. Verificăm dacă faza evenimentului tactil este egală cu au inceput, ceea ce înseamnă că jucătorul a atins, dar nu și-a ridicat degetul înapoi. Dacă este adevărat, setăm viteza și direcția în care a fost atins un dreptunghi. Dacă faza evenimentului tactil este egală cu încheiat, atunci știm că jucătorul și-a ridicat degetul, ceea ce înseamnă că am stabilit viteza 0.

funcția movePlane (eveniment) dacă event.phase == "a început" atunci dacă (event.target.id == "up") atunci playerSpeedY = -playerMoveSpeed ​​se termină dacă (event.target.id == "jos") then playerSpeedY = playMoveSpeed ​​se termină dacă (event.target.id == "stânga"), apoi playerSpeedX = -playerMoveSpeed ​​se termină dacă (event.target.id == "dreapta"), apoi playerSpeedX = playerMoveSpeed ​​end elseif event.phase == "ended" then playerSpeedX = 0 jucătorSpeedY = 0 sfârșitul final

14. PlaneSound

Să adăugăm un sunet la jocul nostru. Adăugați următorul fragment de cod în secțiunea enterScene funcţie. Se încarcă și se joacă planesound.mp3. Prin setarea bucle proprietate la -1, sunetul va rupe pentru totdeauna. Dacă doriți să aflați mai multe despre audio în Corona, asigurați-vă că ați verificat documentația.

planul localSound = audio.loadStream ("planesound.mp3") planeSoundChannel = audio.play (planeSound, loops = -1)

15. enterFrame Eveniment

Adăugăm, de asemenea, un ascultător al evenimentului runtime numit enterFrame care va apelagameLoop funcţie. Frecvența cu care enterFrame evenimentul apare depinde de valoarea cadrelor pe secundă (FPS) pe care le setați config.lua. În exemplul nostru, acesta va fi sunat de 30 de ori pe secundă. Adăugați acest ascultător la eveniment enterScene funcţie.

 Durata de execuție: addEventListener ("enterFrame", gameLoop)

16. gameLoop

În gameLoop funcția actualizăm pozițiile sprite și efectuăm orice altă logică care trebuie să aibă loc în fiecare cadru. Dacă sunteți interesat să citiți mai multe despre buclele de joc, Michael James Williams a scris un articol extraordinar care explică modul în care funcționează o buclă de joc comună. Adăugați următorul fragment de cod.


funcția gameLoop () movePlayer () sfârșitul

17. movePlayer

movePlayer funcția gestionează mișcarea planului jucătorului. Deplasăm avionul în funcție de playerSpeedX și playerSpeedY valori, care fie vor fi 7 sau 0, în funcție de faptul dacă playerul atinge DPad-ul sau nu. Reveniți la movePlane dacă aceasta nu este clară. De asemenea, verificăm anumite limite, asigurându-ne că avionul nu se poate deplasa în afara ecranului.

funcția 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), apoi player.x = display.contentWidth - playerWidth end if (player.y < 0) then player.y = 0 end if(player.y > display.contentHeight - 70-playerHeight), apoi player.y = display.contentHeight - 70 - playerHeight end end 

Dacă încercați jocul acum, ar trebui să puteți naviga în planul din jurul ecranului utilizând DPad.

Concluzie

Acest lucru duce la încheierea celui de-al doilea tutorial al acestei serii. În următoarea tranșă a acestei serii, vom continua cu gameplay-ul. Mulțumesc că ai citit și te-am văzut acolo.

Cod