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.
Å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
.
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)
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
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
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
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
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
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
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
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)
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
getPrevious
på storyboard
gjenstand. Vi fjerner det helt fra storyboardet ved å ringe removeScene
på storyboard
gjenstand.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)
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
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)
enterframe
BegivenhetVi 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)
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
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.
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.