Skrive ditt første Android-spill ved hjelp av Corona SDK

Forfatter: Randy Alexander
Opprettelsesdato: 1 April 2021
Oppdater Dato: 26 Juni 2024
Anonim
Skrive ditt første Android-spill ved hjelp av Corona SDK - Apps
Skrive ditt første Android-spill ved hjelp av Corona SDK - Apps

Innhold


Den mest populære kategorien i Google Play Store har alltid vært Games. Selv om vi sannsynligvis alle bruker viktige produktivitetsapper som en nettleser, en e-postklient og en direktemeldingsapp, er spill fortsatt en viktig del av mobilopplevelsen. Så det er ingen overraskelse at mange som vil lære å utvikle seg for Android, vil begynne med å lage et spill. La oss være ærlige, det er morsommere å skrive et spill enn å utvikle en produktivitetsapp!

Det offisielle språket til Android er Java og det offisielle utviklingsmiljøet er Android Studio. Hvis du vil undersøke Java, så foreslår jeg vår grunnleggende opplæring for Java, og hvis du vil lære hvordan du skriver en app ved hjelp av Android Studio, så foreslår jeg at du sjekker tutorialen vår om å skrive den første Android-appen din. Java og Android studio er imidlertid ikke de eneste måtene å utvikle for Android. Du kan finne en oversikt over tilgjengelige språk og SDK-er i guiden vår: Jeg vil utvikle Android-apper - Hvilke språk skal jeg lære?


En av SDK-ene som er nevnt i programmeringsspråkveiledningen er Corona, en tredjeparts SDK designet først og fremst for å skrive spill. I stedet for Java bruker Corona Lua, et raskt skriptspråk som er lett å lære, men likevel kraftig. Imidlertid er Corona ikke den eneste SDK-en for mobile spill som bruker Lua, andre kjente eksempler inkluderer Cocos2d-X, Marmalade og Gideros.

Last ned og installer

For å komme i gang med Corona må du laste ned og installere SDK. Gå til Corona-nettstedet og trykk på nedlastningsknappen. Du må opprette en konto (som er gratis) før du kan laste ned settet. Hvis du vil bygge en faktisk .apk-fil i stedet for å bare kjøre programmet i emulatoren, må du installere Java 7, men du trenger ikke installere Android SDK. For å installere Java 7 Development Kit, gå til Oracle's nettsted, se etter delen som heter "Java SE Development Kit 7u79" og last ned versjonen til PCen din.


Når du har installert Corona, må du aktivere den. Dette er en engangsprosess, som er gratis. Start Corona Simulator og godta lisensen. Skriv inn e-postadressen og passordet du brukte til nedlastingen, og klikk Logg inn.

Starter prosjektet

Fra Corona Simulator klikker du på "Nytt prosjekt." Skriv inn et navn for appen din i "Programnavn:" -feltet og la resten av innstillingene være som standard. Klikk "OK."

Tre vinduer vil nå vises. De to første er Corona Simulator og Corona Simular Output. Corona vil også åpne et filutforskervindu som viser filene for prosjektet ditt.

Majoriteten av filene (noen av dem 23) i prosjektkatalogen er for applikasjonsikonet! Den viktigste filen for oss akkurat nå er main.lua, da det er her vi skal skrive koden for appen vår.

Introduksjon til Lua

Før vi begynner å skrive koden, må vi ta en whistle-stop tur til Lua. Lua-tolken (husk at dette er et skriptspråk, ikke et kompilert språk) er tilgjengelig for Windows, OS X og Linux. Imidlertid er den innebygd i Corona, så på dette tidspunktet trenger du ikke installere noe ekstra. Den enkleste måten å spille med Lua er å bruke live-demo online.

Du kan finne mange gode opplæringsprogrammer om Lua på nettet, og du bør se på Lua Referansehåndbok, Programmering i Lua, The.Lua.Tutorial og The Tutorials Point Lua Tutorial.

Her er et lite Lua-program som viser deg noen av nøkkelfunksjonene i Lua:

lokal funksjon doubleIt (x) return x * 2 end for i = 1,10,1 do x = doubleIt (i) hvis (x == 10) så skriv ut ("ti") annet print (doubleIt (i)) endend

Koden over viser tre viktige Lua-konstruksjoner: funksjoner, løkker og hvis uttalelser. Funksjonen doubleIt () er veldig enkelt, det dobler bare passert parameter x.

Hovedkoden er en til sløyfe fra 1 til 10. Det ringer doubleIt () for hver iterasjon. Hvis returverdien er 10 (dvs. når Jeg er 5) så skriver koden ut “ti” ellers skriver den bare ut resultatet av doubleIt ().

Hvis du har noen kodingserfaring, bør eksempelkoden være enkel nok til å følge. Hvis du ønsker å lære deg grunnleggende programmering, foreslår jeg at du bruker noen av ressursene som er koblet ovenfor for å finpusse ferdighetene dine.

Å skrive spillet

Å skrive grunnleggende programmer i Corona er enkelt. Du trenger bare å bekymre deg for én fil, main.lua, og la Corona gjøre alt det tunge løftet. Spillet vi skal skrive er et enkelt "trykk" -spill. En ballong eller en bombe vil mislykkes på skjermen. Hvis spilleren banker på ballongen de scorer et poeng, banker de på en bombe så blir scoringen delt med 2, som en straff. For å skrive koden må du redigere main.lua. Du kan gjøre dette i hvilken som helst tekstredigerer.

Corona SDK har en innebygd 2D fysikkmotor, som gjør byggespill veldig enkelt. Det første trinnet i å skrive spillet er å initialisere fysikkmotoren:

lokal fysikk = krever ("fysikk") fysikk.start ()

Koden er ganske selvforklarende. Modulfysikken lastes og initialiseres, den tilordnes variabelen fysikk. For å aktivere motorenphysics.start () er kalt.

Deretter lager vi noen nyttige variabler som vil være nyttige ikke bare for dette enkle spillet, men også for mer komplekse spill. halfW og halfH hold verdiene for halvparten av skjermbredden og halvparten av skjermhøyden:

halfW = display.contentWidth * 0.5 halfH = display.contentHeight * 0.5

De vise objekt er et forhåndsdefinert objekt som Corona gjør globalt tilgjengelig.

Nå kommer det første trinnet som faktisk får noe til å skje på skjermen:

local bkg = display.newImage ("night_sky.png", halfW, halfH)

Samt egenskaper som contentHeight og contentWidth, den vise objektet har også mange nyttige funksjoner. De newImage () -funksjonen leser en bildefil (i dette tilfellet en .png) og viser den på skjermen. Visningsobjekter er gjengitt i lag, så siden dette er det første bildet vi legger på skjermen, vil det alltid være bakgrunnen (med mindre koden eksplisitt gjør noe for å endre det). Parametrene halfW og halfH be Corona om å plassere bildet i midten.

På dette tidspunktet kan du kjøre koden i emulatoren og se bakgrunnsbildet. Hvis du lagrer filen, vil emulatoren legge merke til at filen har endret seg og tilbyr å starte på nytt. Hvis det ikke skjer, bruk File-> Relaunch.

Siden brukeren vil score poeng for å tappe på ballonger, må vi initialisere en poengsumvariabel og vise poengsummen på skjermen:

score = 0 scoreTekst = display.nyttTekst (score, halvW, 10)

Poengsummen holdes i den fantasifulle navngitte variabelen ballen,og scoreText er objektet som viser poengsummen. Som newImage (), newText () legg noe på skjermen, i dette tilfellet tekst. Siden scoreText er en global variabel, så kan vi endre teksten når som helst. Men det kommer vi snart til.

Du kan starte emulatoren på nytt og se poengsummen til 0-displayet øverst på skjermen.

Venstre: Bare bakgrunnen. Til høyre: Bakgrunn og poengsum.

Nå kommer noe mer vanskelig, men ikke bekymre deg for at jeg vil forklare det linje for linje:

lokal funksjon balloonTouched (event) if (event.phase == "begynte") deretter Runtime: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = score + 1 scoreText.text = score end end

Koden over definerer en funksjon som heter balloonTouched () som vil bli kalt hver gang en ballong tappes. Vi har ennå ikke bedt Corona om å ringe denne funksjonen hver gang ballongen er tappet, som vil komme senere, men når vi gjør dette er det funksjonen som blir ringt.

Trykk på eller berør hendelser har flere stadier, mange for å støtte dra. Brukeren setter fingeren på et objekt, dette er den "begynnte" fasen. Hvis de skyver fingeren i noen retning, er det den "flyttede" fasen. Når brukeren løfter fingeren fra skjermen, er det den "avsluttede" fasen.

Den første linjen av balloonTouched () sjekker at vi er i "begynte" -fasen. Vi ønsker å fjerne ballongen og øke poengsummen så snart det er mulig. Hvis funksjonen blir kalt igjen for andre faser som "avsluttet", gjør ikke funksjonen noe.

Inne ihvis uttalelse er fire linjer med kode. La oss håndtere de to siste først, ettersom de er enklere.poengsum = poengsum + 1 bare øker poengsummen med en ogscoreText.text = score endrer poengteksten på skjermen for å gjenspeile den nye poengsummen. Husker hvordan jeg sa detscoreText var global og kunne nås hvor som helst, og det er det vi gjør her.

Nå for de to første linjene. Når en ballong eller bombe faller nederst på skjermen, eksisterer den fremdeles i appens minne, det er bare at du ikke kan se den. Når spillet skrider frem vil antallet av disse objektene utenfor skjermen øke stadig. Derfor må vi ha en mekanisme som sletter gjenstander når de er ute av syne. Det gjør vi i en funksjon som heteroffscreen, som vi ikke har skrevet ennå. Denne funksjonen vil bli kalt en gang per ramme i løpet av spillet. Når en ballong er tappet, må vi slette den og fjerne samtalen som sjekker om ballongen har gått utenfor skjermen.

Linjenevent.target:removeSelf () sletter ballongen. Når en berøringshendelse oppstår, er en av parameterne til lytterfunksjonenbegivenhet parameter. Den forteller funksjonen om hendelsen og hvilken type hendelse det er, f.eks.event.phase. Den forteller oss hvilken ballong som ble tappet,event.target. DeremoveSelf () funksjon gjør det den sier at den gjør, den sletter objektet (i dette tilfellet en ballong).

Linjen før det fjerner “enterframe” -lytteren, som er funksjonen som kalles hver ramme for å se om ballongen har falt av bunnen av skjermen. Vi vil se nærmere på det når vi kommer til å skriveoffscreen lytterfunksjon.

Så for å gjenskape.balloonTouched ()sjekker at dette er begynnelsen på berøringssekvensen. Deretter fjernes “enterframe” -lytteren, som er funksjonen som kalles hver ramme for å se om ballongen har falt av bunnen av skjermen. Den sletter deretter ballongen, øker poengsummen og viser den nye poengsummen.

Det var for ballonger, nå trenger vi noe lignende for bomber:

lokal funksjon bombTouched (event) if (event.phase == "begynte") så Runtime: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = math.floor (score * 0.5) scoreText.text = score slutt slutt

Som du kan se er koden veldig lik, med unntak av at stedet for å øke poengsummen, blir poengsummen multiplisert med 0,5 (dvs. delt med 2). De math.floor () funksjon avrunder poengsummen til nærmeste heltall. Så hvis spilleren hadde en score på 3 og banket på en bombe, ville den nye poengsummen være 1, og ikke 1,5.

Jeg nevnte offscreen () funksjon tidligere. Denne funksjonen vil bli kalt hver ramme for å sjekke om et objekt har gått av skjermen. Her er koden:

lokal funksjon offscreen (self, event) if (self.y == nil) så returnere end if (self.y> display.contentHeight + 50) deretter Runtime: removeEventListener ("enterFrame", self) self: removeSelf () end end

I databehandling er det en situasjon kjent som en rase-tilstand. Det er her to ting kommer til å skje, men det ene kan skje først, eller noen ganger kan det andre skje først. Det er et løp. Noen løpsforhold er usett fordi en ting alltid ser ut til å skje først, men de kan forårsake interessante feil i løpet av den ene dagen, under de rette forholdene, skjer den andre ting først og så går systemet i stykker!

Det er en løpsbetingelse i dette enkle spillet fordi to ting kan skje veldig nær hverandre: en ballong som tappes og offscreen () funksjonen blir kalt for å se om ballongen har gått av skjermen. Resultatet er at koden for å slette ballongen kan kalles og deretter offscreen () funksjon kalles (som skjer som 30 ganger per sekund). For å komme deg rundt denne rare hendelsesrekkefølgen offscreen () funksjonen må sjekke om y verdien av objektet er nil (null) eller ikke. Hvis det er nil da betyr det at objektet allerede er slettet, så flytt med, dette er ikke droidene vi leter etter.

Hvis objektet fremdeles er i avspilling, må du sjekke plasseringen, hvis det har gått 50 piksler fra skjermen, slett det og fjern lytteren slik at offscreen () funksjonen vil ikke bli kalt igjen for dette objektet. Koden for å sikre at detoffscreen () kalles hver ramme er en del av den neste delen av koden.

Hele forutsetningen for dette spillet er at nye ballonger eller bomber vil fortsette å slippe ned skjermen. Derfor trenger vi en funksjon som lager enten en ny ballong eller en ny bombe:

lokal funksjon addNewBalloonOrBomb () lokal startX = math.random (display.contentWidth * 0.1, display.contentWidth * 0.9) if (math.random (1,5) == 1) da - BOMB! local bomb = display.newImage ("bomb.png", startX, -300) physics.addBody (bomb) bomb.enterFrame = offscreen Runtime: addEventListener ("enterFrame", bomb) bomb: addEventListener ("touch", bombTouched) annet - Ballong lokal ballong = display.newImage ("red_balloon.png", startX, -300) fysikk.addBody (ballong) ballong.enterFrame = offscreen Kjøretid: addEventListener ("enterFrame", ballong) ballong: addEventListener ("touch", "touch", balloonTouched) sluttende

Den første linjen i funksjonen bestemmer hvor ballongen vil droppe fra på x planet. Hvis ballongen eller bomben alltid falt i midten, vil det ikke være veldig interessant! Såstartx er et tilfeldig tall mellom 10 prosent og 90 prosent av skjermbredden.

Neste blir et tilfeldig antall valgt mellom 1 og 5.Hvis tallet er 1, vil en bombe bli droppet. Hvis det 2, 3, 4 eller 5, vil en ballong slippes. Det betyr at bomber vil bli droppet rundt 20 prosent av tiden.

Bomben og ballongkoden er ganske like. Først vises bildet (enten en bombe eller en ballong) ved hjelp avnewImage(). Det er x posisjon er den avstartx mens det er y posisjon er satt til -300, dvs. utenfor toppen av skjermen. Årsaken til det er at vi ønsker at objektet skal falle fra utsiden av skjermområdet inn i det synlige området og deretter av bunnen. Siden vi bruker 2D-fysikkmotoren er det godt å gi objektet litt av en innledende avstand til å falle, slik at den kan få litt fart.

Oppfordringen tilphysics.addBody () tar bildet lastet av newImage () og gjør det til et objekt i fysikkmotoren. Dette er veldig kraftig. Alle bildefiler kan gjøres til et organ som reagerer på tyngdekraften og kollisjoner bare ved å ringephysics.addBody ().

De tre siste linjene i bombe- eller ballongkoden satte lytterne opp. Innstilling aventerframe eiendom forteller Corona hvilken funksjon som skal ringe hver ramme og samtalen tilSpilletid: addEventListener () setter det opp. Til slutt oppfordringen tilballong: addEventListener () forteller Corona hvilken funksjon å ringe hvis bomben eller ballongen blir berørt.

Og nå er spillet nesten komplett. Vi trenger bare to kodelinjer til:

addNewBalloonOrBomb () timer.performWithDelay (500, addNewBalloonOrBomb, 0)

Den første linjen får den aller første bomben eller ballongen til å falle ved eksplisitt å ringeaddNewBalloonOrBomb (). Den andre linjen setter opp en timer som vil ringeaddNewBalloonOrBomb () hvert halvt sekund (500 millisekunder). Dette betyr at en ny ballong eller bombe vil falle hvert halvt sekund.

Du kan nå kjøre spillet i emulatoren.

Her er den komplette listen for main.lua, hele prosjektkildekoden for dette spillet finner du her på GitHub.

-------------------------------------------------- --------------------------------------- - - Fallende ballong og bombespill - Skrevet av Gary Sims for - ------------------------------------------- ---------------------------------------------- - Start fysikk motor lokal fysikk = krever ("fysikk") fysikk.start () - Beregn halvparten av skjermbredden og høyden halvW = display.contentWidth * 0.5 halfH = display.contentHeight * 0.5 - Angi bakgrunnen lokal bkg = display.newImage ("night_sky.png", halfW, halfH) - Poengscore = 0 scoreText = display.newText (score, halvW, 10) - Kalt når ballongen er tappet av spilleren - Øk poengsummen med en lokal funksjonsballongTouched ( hendelse) hvis (event.phase == "begynte") så Runtime: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = score + 1 scoreText.text = score end end - Kalt når bomben tappes av spilleren - Halvparten av poengsummen som en straff lokal funksjon bombTouched (hendelse) if (event.phase == "begynte") deretter Runtime: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = math.floor (score * 0.5) scoreText.text = score end end - Slett objekter som har falt utenfor nederst på skjermen lokal funksjon offscreen (self, event) if (self.y == nil) så returnere end if (self.y> display.contentHeight + 50) deretter Runtime: removeEventListener ("enterFrame", self) self: removeSelf () end end - Legg til en ny fallende ballong eller bomb lokalfunksjon addNewBalloonOrBomb () - Du kan finne red_ballon.png og bomb.png i GitHub repo lokal startX = math.random (display.contentWidth * 0.1, display.contentWidth * 0,9) hvis (matematikk.random (1,5) == 1) da - BOMB! local bomb = display.newImage ("bomb.png", startX, -300) physics.addBody (bomb) bomb.enterFrame = offscreen Runtime: addEventListener ("enterFrame", bomb) bomb: addEventListener ("touch", bombTouched) annet - Ballong lokal ballong = display.newImage ("red_balloon.png", startX, -300) fysikk.addBody (ballong) ballong.enterFrame = offscreen Kjøretid: addEventListener ("enterFrame", ballong) ballong: addEventListener ("touch", "touch", balloonTouched) endend - Legg til en ny ballong eller bombe nå addNewBalloonOrBomb () - Fortsett å legge til en ny ballong eller bombe hver 0,5 sekund timer. Utfør medithelay (500, addNewBalloonOrBomb, 0)

Neste skritt

Neste trinn er å spille spillet på en ekte Android-enhet. For å bygge en .apk-fil, klikk på File-> Build for Android… og fyll ut feltene. Resultatet blir en .apk-fil som du kan kopiere til enheten din og deretter installere. Du må sørge for at du har konfigurert enheten din slik at den tillater installasjon av app fra ukjente kilder. Amazon har noe god dokumentasjon på dette da du også må angi dette for å installere Amazon Appstore. Corona har også en guide for hvordan du signerer, bygger og tester appen din på Android-enheter.

Når spillet er installert på enheten din, er det neste du må gjøre å forbedre spillet. For eksempel, hvorfor ikke prøve å legge til en "pop" eller "smell" lyd alt en ballong eller bombe tappes på. Corona har en API for det:media.playEventSound ().

Eller hvorfor ikke prøve å legge til en tredje type objekt, si en super boost som dobler den nåværende poengsummen, eller hva med litt bakgrunnsmusikk?

Wrap-up

Å skrive spill med Corona er ganske rett frem fordi SDK håndterer ting som OpenGL og det inkluderer en innebygd 2D-fysikkmotor. Lua er også enkel å lære og burde ikke være vanskelig for noen med selv minimum av programmeringserfaring. Coronalabs nettsted har mye dokumentasjon inkludert mange guider og tutorials.

På mindre enn 100 kodelinjer har vi et fungerende spill. OK, det kommer ikke til å vinne noen premier, men det viser kraften og fleksibiliteten til Corona SDK.

Out-of-the-box tøtter Android tandard UI-komponenter en rekke Android-bevegeler, men noen ganger kan appen din trenge å tøtte mer enn bare onClick!...

Mobile World Congre 2019 er noe uventet ut om en av de tørte begivenhetene innen marttelefonteknologi på mange år.Fra mandag 25. februar i Barcelona, ​​vil media være i gang med vi...

Populære Publikasjoner