Bygg et struts-uendelig scroller-spill

I denne opplæringsserien vil jeg vise deg hvordan du lager et uendelig scroller-spill med Corona SDK ved å bygge et Ostrich Runner-spill. Du lærer om å rulle objekter, fysikkmanipulering, berøringsreguleringer og kollisjonsdeteksjon. Målet med spillet er å flytte tegnet og samle gjenstander for å heve poengsummen. Les videre!


1. Applikasjonsoversikt

Ved å bruke pre-laget grafikk vil vi kode et underholdende spill ved hjelp av Lua og Corona SDK API.

Spilleren vil kunne bruke berøringsskjermen på enheten for å flytte tegnet og samle gjenstander. Du kan endre parametrene i koden for å tilpasse spillet.


2. Målgruppe

Det første vi må gjøre er å velge plattformen vi vil kjøre vår app på, slik at vi kan velge størrelsen på bildene vi skal bruke.

IOS-plattformen har disse egenskapene:

  • iPad 1/2 / Mini: 1024x768px, 132 ppi
  • iPad Retina: 2048x1536, 264 ppi
  • iPhone / iPod Touch: 320x480px, 163 ppi
  • iPhone / iPod Retina: 960x640px, 326 ppi
  • iPhone 5 / iPod Touch: 1136x640, 326 ppi

Fordi Android er en åpen plattform, er det mange forskjellige enheter og løsninger. Noen av de vanligste skjermegenskapene er:

  • Asus Nexus 7 Tablet: 800x1280px, 216 ppi
  • Motorola Droid X: 854x480px, 228 ppi
  • Samsung Galaxy S III: 720x1280px, 306 ppi

I denne opplæringen vil vi fokusere på iOS-plattformen med grafisk design, spesielt utviklet for distribusjon til en iPhone / iPod touch, men koden som presenteres her, bør gjelde for Android-utvikling med Corona SDK også.


3. Grensesnitt

Et enkelt og vennlig grensesnitt vil bli brukt. Grensesnittet vil innebære flere former, knapper, bitmap og mer.

Grensesnittet grafiske ressurser som kreves for denne opplæringen finner du i vedlagte nedlastning.


4. Eksporter grafikk

Avhengig av hvilken enhet du har valgt, må du kanskje eksportere grafikken i den anbefalte PPI-en. Du kan gjøre dette ved å bruke favorittbildeditoren din.

Jeg brukte Juster størrelse ... Fungerer i Forhåndsvisning-appen på Mac OS X.

Husk å gi bildene et beskrivende navn og lagre dem i prosjektmappen din.


5. Appkonfigurasjon

En ekstern fil vil bli brukt til å gjøre programmet gå fullskjerm på tvers av enheter, config.lua fil. Denne filen viser den opprinnelige skjermstørrelsen og metoden som brukes til å skalere innholdet hvis appen kjøres i en annen skjermoppløsning.

 søknad = content = width = 320, height = 480, scale = "letterbox",

6. Main.lua

La oss nå skrive søknaden!

Åpne din foretrukne Lua-editor (noen tekstredigerer vil fungere, men du vil ikke ha syntaxutheving) og forberede deg på å skrive din fantastiske app. Husk å lagre filen som main.lua i prosjektmappen din.


7. Kode struktur

Vi strukturerer vår kode som om den var en klasse. Hvis du kjenner ActionScript eller Java, bør du finne strukturen kjent.

 Necesary Classes Variabler og Constants Declare Funksjoner contructor (Hovedfunksjon) klassemetoder (andre funksjoner) ring Hovedfunksjon

8. Skjul statuslinjen

 display.setStatusBar (display.HiddenStatusBar)

Denne koden skjuler statuslinjen. Statuslinjen er linjen øverst på skjermbildet som viser tid, signal og andre indikatorer.


9. Importfysikk

Vi bruker Fysikk biblioteket til å håndtere kollisjoner. Bruk denne koden til å importere den:

 -- Fysikk lokalfysikk = krever (fysikk) fysikk.start ()

10. Bakgrunn

En enkel grafikk brukes som bakgrunn for applikasjonsgrensesnittet, den neste koden lagrer den.

 -- Grafikk - [Bakgrunn] lokal bg = display.newImage ('bg.png')

11. Tittelvisning

Dette er tittelvisningen, det blir den første interaktive skjermen som vises i vårt spill. Disse variablene lagrer komponentene:

 -- [Title View] lokal tittel lokal playBtn local creditsBtn local titleView

12. Kredittvisning

Denne visningen vil vise kreditter og opphavsrett til spillet. Denne variabelen brukes til å lagre den:

 -- [CreditsView] lokale kreditterVis

13. Spill Bakgrunn

Bakgrunnsnivået, det legger også til tekstfeltet.

 -- Spill Bakgrunn Lokalt spillBg

14. Instruksjonsmelding

En instruksjonsmelding vil vises i starten av spillet, den blir tweened ut etter 2 sekunder.

 -- Instruksjoner lokale ins

15. Tegn

Tegnet grafisk. Målet med spillet er å flytte det opp og ned på skjermen for å samle kirsebærene.

 -- Ostrich lokale struds

16. Kirsebær

Kirsebær grafikk. Det er også dårlige kirsebær som vil få deg til å miste spillet.

 -- Cherrys lokale kirsebær

17. Pad

Puten grafikk. Trykk på dem for å flytte tegnet.

 -- Pad lokal opp lokalt nede

18. Alert

Dette er varselet som vil bli vist når en dårlig kirsebær er samlet. Det vil fullføre nivået og avslutte spillet.

 -- Varsle lokal varslingView

19. Lyder

Vi bruker lydeffekter for å forbedre følelsen av spillet, du kan finne musikken som brukes i dette eksempelet på playonloop.com. Lyder ble opprettet i as3sfxr.

 -- Høres lokal bgMusic = audio.loadStream ('POL-lilla-hills-short.mp3') lokale cherrySnd = audio.loadSound ('cherry.mp3') lokal badCherrySnd = audio.loadSound ('badCherry.mp3')

20. Variabler

Dette er variablene vi skal bruke. Les kommentarene i koden for å lære mer om dem.

 -- Variabler lokal timerSrc - legg til kirsebærstimulator lokal yPos = 108, 188, 268 - mulige struts y posisjoner lokal hastighet = 5 - kirsebær hastighet lokal speedTimer - timer for å endre hastigheten på kirsebærene

21. Erklær Funksjoner

Erklære alle funksjoner som lokal i begynnelsen.

 -- Funksjoner lokal Main =  lokal startButtonListeners =  lokal showCredits =  lokal hideCredits =  lokal showGameView =  lokal spillListeners =  lokal startGame =  lokal createCherry =  lokal moveSpeed ​​=  local increaseSpeed ​​=   lokal oppdatering =  lokal onCollision =  lokal varsling = 

22. Konstruktør

Deretter skal vi opprette funksjonen som vil initialisere all spilllogikken:

 funksjon Hoved () - kode ... ende

23. Legg til tittelvisning

Nå plasserer vi tittelvisningen i scenen og kaller en funksjon som vil legge til springen lytter til knappene.

 funksjon Main () titleBg = display.newImage ('title.png', 113, 43) playBtn = display.newImage ('playBtn.png', 219, 160) creditsBtn = display.newImage ('creditsBtn.png', 205, 223) titleView = display.newGroup (bg, titleBg, playBtn, creditsBtn) startButtonListeners ('add') slutten

24. Start-knappelyttere

Denne funksjonen legger til de nødvendige lytterne til TitleView knapper.

 funksjon startButtonListeners (action) hvis (action == 'add') så spillBtn: addEventListener ('tap', showGameView) kreditterBtn: addEventListener ('tap', showCredit) annet playBtn: removeEventListener ('tap', showGameView) creditsBtn: removeEventListener "trykk", showCredits) slutten

25. Vis kreditt

Kredittskjermbildet vises når brukeren tapper om knappen. EN springen lytteren legges til kredittvisningen for å fjerne den.

 funksjonsvisningKreditter: trykk (e) playBtn.isVisible = false creditsBtn.isVisible = false creditsView = display.newImage ('credits.png', -130, display.contentHeight-140) transition.to (creditsView, time = 300, x = 65, onComplete = function () creditsVis: addEventListener ('tap', hideCredits) end) ende

26. Skjul studiepoeng

Når kreditter skjermen er tappet, vil den bli tweened ut av scenen og fjernet.

 funksjon hideCredits: trykk (e) playBtn.isVisible = true creditsBtn.isVisible = true transition.to (creditsView, time = 300, y = display.contentHeight + creditsView.height, onComplete = function () creditsVis: removeEventListener , hideCredits) display.remove (creditsView) creditsView = null end) slutt

27. Vis spillvisning

Når Spille knappen er tappet, tittelvisningen er tweened og fjernet, avslørende spillvisningen. Det er mange deler involvert i denne visningen, så vi deler dem i de neste trinnene.

 funksjon showGameView: trykk (e) transition.to (titleView, time = 300, x = -titleView.height, onComplete = funksjon () startButtonListeners ('rmv') display.remove (titleView) titleView = null end)

28. Instruksjoner Melding

Følgende linjer legger til spillinstruksjonene.

 -- Instruksjoner Melding inn = display.newImage ('ins.png', 187, 199)

29. Score TextField

Denne delen skaper Score TextField på scenen.

 -- TextFields scoreTF = display.newText ('0', 258, 26.5, 'Marker Felt', 16) scoreTF: setTextColor (184, 165, 104)

30. Struts

Legg strutskarakteren til nivået.

 -- Strutsstruts = display.newImage ('ostrich.png', 11, 180)

31. Pad

Dette er kontrollene på skjermen for spillet.

 -- Pute opp = display.newImage ('up.png', 418, 20) ned = display.newImage ('down.png', 418, 258) up.name = 'opp' down.name = 'down'

32. Fysikk

Deretter legger vi til fysikk til spillobjektene. Vi lager også en Bord for kirsebær og ring til gameListeners funksjon.

 -- Legg til Strutsfysikkfysikk.addBody (struts) ostrich.isSensor = true cherrys = display.newGroup () gameListeners ('add') slutten

33. Spillelyttere

Denne funksjonen legger til de nødvendige lytterne for å starte spilllogikken.

 funksjonen spilllistere (handling) hvis (handling == 'legg til') deretter inn: addEventListener ('tap', startGame) Runtime: addEventListener ('enterFrame', oppdatering) opp: addEventListener ('tap', movePlayer) ned: addEventListener trykk ', movePlayer) speedTimer = timer.performWithDelay (5000, increaseSpeed, 5) ellers Runtime: removeEventListener (' enterFrame ', oppdater) opp: removeEventListener (' tap ', movePlayer) ned: removeEventListener (' tap ', movePlayer) avbryte (timerSrc) timerSrc = nil timer.cancel (speedTimer) speedTimer = null ende

34. Start spillet

I denne delen fjerner vi instruksjonsmeldingen, begynner å spille bakgrunnsmusikken, og lag en tidtaker som vil legge til en kirsebær hver 400 millisekunder.

 funksjon startGame () ins: removeEventListener ('tap', startGame) display.remove (ins) audio.play (bgMusic, loops = -1, channel = 1) timerSrc = timer.performWithDelay (400, createCherry, 0) end

35. Lag kirsebær

Den neste kodestykket oppretter en vanlig eller dårlig kirsebær basert på et tilfeldig tall og plasserer det på skjermen. Den resulterende gjenstanden blir lagt til fysikkmotoren for å sjekke for kollisjoner.

 funksjon createCherry () lokal kirsebær lokal rnd = math.floor (math.random () * 4) + 1 hvis (rnd == 4) deretter kirsebær = display.newImage ('badCherry.png', display.contentWidth, yPos .floor (math.random () * 3) +1]) cherry.name = 'dårlig' annet kirsebær = display.newImage ('cherry.png', display.contentWidth, yPos [math.floor (math.random * 3) +1)) cherry.name = 'kirsebær' -end - Kirsebærfysikkfysikk.addBody (kirsebær) cherry.isSensor = ekte kirsebær: addEventListener (kollisjon), kollisjoner

36. Flytt spiller

Vi endrer Y-posisjonen til strupen ved hjelp av kontrollputen vi opprettet tidligere.

 funksjon movePlayer (e) if (e.target.name == 'up' og struts.y ~ = 122) deretter ostrich.y = struts.y - 80 elseif (e.target.name == 'down' og struds. y = = 282) deretter struts.y = struts.y + 80 ende

37. Øk hastighet

En timer vil øke hastigheten hvert 5. sekund. Et ikon vises for å varsle spilleren om hastighetsendringen.

 funksjon økningSpeed ​​() speed = hastighet + 2 - ikon lokalt ikon = display.newImage ('speed.png', 204, 124) overgang.fra (ikon, time = 200, alfa = 0,1, onComplete = funksjon .performWithDelay (500, funksjon () overgang.to (ikon, tid = 200, alfa = 0,1, onComplete = funksjon () display.remove (ikon) icon = null end) ende) ende) ende

38. Oppdateringsfunksjon

Denne funksjonen håndterer kirsebærbevegelsen. Den bruker hastighetsvariabelen til å bestemme hvor mange piksler som skal flyttes kirsebær hver ramme.

 funksjonsoppdatering () hvis (kirsebær ~ = null) deretter for i = 1, cherrys.numChildren gjør kirsebærer [i] .x = kirsebærer [i] .x - hastighets endeendens ende

39. Kollisjoner

Nå sjekker vi om kirsebæret kolliderer med struts ved hjelp av følgende kode. Poenget øker når en vanlig kirsebær kolliderer og et varsel kalles når en dårlig kirsebær berøres. I begge tilfeller er kirsebæret fjernet og en lyd spilles.

 Funksjon onCollision (e) e.target:removeEventListener('Collision ', onCollision) display.remove (e.target) hvis (e.target.name ==' kirsebær ') deretter --Score scoreTF.text = tostring (tonnummer scoreTF.text) + 50) audio.play (cherrySnd) - dårlig kirsebær elseif (e.target.name == 'dårlig') deretter audio.play (badCherrySnd) alert () endeend

40. Alert

Varslingsfunksjonen oppretter en varselvisning, animerer den, og avsluttes deretter.

 funksjonalarm () audio.stop (1) audio.dispose () bgMusic = nil gameListeners ('rmv') alertView = display.newImage ('alert.png', 160, 115) transition.from (alertView, time = 300 , xScale = 0.5, yScale = 0.5) lokal score = display.newText (scoreTF.text, (display.contentWidth * 0.5) - 12, (display.contentHeight * 0.5) + 5, 'Marker Felt', 18) setTextColor (184, 165, 104) - Vent 100 ms for å stoppe fysikk timer.performWithDelay (1000, funksjon () fysikk.stop () ende, 1) ende

41. Ring hovedfunksjon

For å starte spillet, er Hoved funksjonen må kalles. Med ovennevnte kode på plass, gjør vi det her:

 Hoved()

42. Laster skjerm

Default.png-filen er et bilde som skal vises rett når du starter programmet mens iOS laster de grunnleggende dataene for å vise hovedskjermbildet. Legg til dette bildet i prosjektkildemappen, det blir automatisk lagt til av Corona-kompilatoren.


43. Ikon

Ved hjelp av grafikken du opprettet før, kan du nå lage et fint og godt utseende-ikon. Ikonstørrelsen for iPhone-ikonet med ikke-retina er 57x57px, men netthinnen versjonen er 114x114px og iTunes-butikken krever en 512x512px-versjon. Jeg foreslår at du oppretter 512x512 versjonen først og deretter skaler ned for de andre størrelsene.

Det trenger ikke å ha de avrundede hjørner eller gjennomsiktig blikk, iTunes og iPhone vil gjøre det for deg.


44. Testing i simulatoren

Det er på tide å gjøre den endelige testen. Åpne Corona Simulator, bla til prosjektmappen din, og klikk deretter Åpne. Hvis alt fungerer som forventet, er du klar for det siste trinnet!


45. Bygg

I Corona Simulator, gå til Fil> Bygg og velg målrettingsenheten. Fyll de nødvendige dataene og klikk bygge. Vent noen få sekunder, og appen din vil være klar til testing av enheten og / eller innsending for distribusjon!


Konklusjon

I denne serien har vi lært om fysikkadferd, trykk på lyttere og kollisjoner. Disse ferdighetene kan være veldig nyttige i et stort antall spill!

Eksperimenter med det endelige resultatet, og prøv å lage din egendefinerte versjon av spillet!

Jeg håper du likte denne opplæringen og finner det nyttig. Takk for at du leser!