Î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.
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
.
createScene
Începeți prin adăugarea funcției createScene
funcția pentru a main.lua. createScene
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ă)
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
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
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
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
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 ()
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
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
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ă)
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.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
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
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)
enterFrame
EvenimentAdă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)
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
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.
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.