Skriv dit første Android-spil ved hjælp af Corona SDK

Forfatter: Randy Alexander
Oprettelsesdato: 1 April 2021
Opdateringsdato: 26 Juni 2024
Anonim
Skriv dit første Android-spil ved hjælp af Corona SDK - Apps
Skriv dit første Android-spil ved hjælp af Corona SDK - Apps

Indhold


Den mest populære kategori i Google Play Store har altid været spil. Selvom vi sandsynligvis alle bruger centrale produktivitetsapps som en webbrowser, en e-mail-klient og en instant messaging-app, er gaming stadig en vigtig del af mobiloplevelsen. Så det er ingen overraskelse, at mange mennesker, der ønsker at lære at udvikle sig til Android, vil starte med at lave et spil. Lad os også være ærlige, at skrive et spil er en hel masse sjovere end at udvikle en produktivitetsapp!

Det officielle sprog til Android er Java, og det officielle udviklingsmiljø er Android Studio. Hvis du vil undersøge Java, foreslår jeg vores Java-grundlæggende tutorial, og hvis du vil lære at skrive en app ved hjælp af Android Studio, så foreslår jeg, at du tjekker vores tutorial til at skrive din første Android-app. Java og Android studio er dog ikke de eneste måder at udvikle til Android på. Du kan finde en oversigt over de tilgængelige sprog og SDK'er i vores guide: Jeg vil udvikle Android Apps - Hvilke sprog skal jeg lære?


En af de SDK'er, der er nævnt i guiden til programmeringssprog, er Corona, en tredjeparts SDK, der primært er designet til at skrive spil. I stedet for Java bruger Corona Lua, et hurtigt script-sprog, der er let at lære, men alligevel kraftigt. Corona er dog ikke den eneste SDK til mobilspil, der bruger Lua, andre velkendte eksempler inkluderer Cocos2d-X, Marmalade og Gideros.

Download og installer

For at komme i gang med Corona bliver du nødt til at downloade og installere SDK. Gå til Corona-webstedet, og tryk på download-knappen. Du skal oprette en konto (som er gratis), før du kan hente kittet. Hvis du vil opbygge en faktisk .apk-fil i stedet for bare at køre dit program i emulatoren, skal du installere Java 7, men du behøver ikke at installere Android SDK. Hvis du vil installere Java 7 Development Kit, skal du gå til Oracle's websted. Se efter afsnittet "Java SE Development Kit 7u79" og downloade versionen til din pc.


Når du har installeret Corona, skal du aktivere det. Dette er en engangsproces, som er gratis. Start Corona Simulator og accepter licens. Indtast e-mail-adressen og adgangskoden, som du brugte til download, og klik på Login.

Start af projektet

Fra Corona Simulator skal du klikke på "Nyt projekt." Indtast et navn til din app i feltet "Programnavn:" og lad resten af ​​indstillingerne være ved deres standardindstillinger. Klik på "OK."

Tre vinduer vises nu. De to første er Corona Simulator og Corona Simular Output. Corona åbner også et filudforskervindue, der viser filerne til dit projekt.

Størstedelen af ​​filerne (ca. 23 af dem) i projektbiblioteket er til applikationsikonet! Den vigtigste fil for os lige nu er main.lua, da det er her, vi skriver koden til vores app.

Introduktion til Lua

Inden vi begynder at skrive koden, er vi nødt til at foretage en whistle-stop-rundvisning i Lua. Lua-tolken (husk at dette er et scriptingsprog, ikke et kompileret sprog) er tilgængeligt til Windows, OS X og Linux. Men det er indbygget i Corona, så på dette tidspunkt behøver du ikke at installere noget ekstra. Den nemmeste måde at lege med Lua er at bruge online live demo.

Du kan finde masser af gode tutorials om Lua online, og du bør se på Lua Reference Manual, Programmering i Lua, The.Lua.Tutorial og Tutorials Point Lua Tutorial.

Her er et lille Lua-program, der viser dig nogle af nøglefunktionerne i Lua:

lokal funktion dobbeltIt (x) retur x * 2 ende for i = 1,10,1 do x = dobbeltIt (i) hvis (x == 10) tryk derefter ("ti") ellers udskriv (dobbeltIt (i)) slutende

Koden ovenfor viser tre vigtige Lua-konstruktioner: funktioner, sløjfer og hvis udsagn. Funktionen doubleIt () er meget simpelt, det dobler bare det vedlagte parameter x.

Hovedkoden er en til loop fra 1 til 10. Det ringer doubleIt () for hver iteration. Hvis returværdien er 10 (dvs. hvornår jeg er 5) så udskriver koden “ti”, ellers udskriver den bare resultatet af doubleIt ().

Hvis du har nogen kodningsoplevelse, skal eksemplekoden være let nok til at følge. Hvis du ønsker at lære nogle grundlæggende programmering, så foreslår jeg, at du bruger nogle af de ressourcer, der er knyttet herover til at finpudse dine evner.

At skrive spillet

At skrive grundlæggende programmer i Corona er enkelt. Du behøver kun bekymre dig om en fil, main.lua, og lad Corona gøre alt det tunge løft. Det spil, vi skal skrive, er et simpelt “tryk” -spil. En ballon eller en bombe vil mislykkes på skærmen. Hvis spilleren tapper på ballonen, de scorer et point, trykker de på en bombe, så bliver scoringen divideret med 2, som en straf. For at skrive koden skal du redigere main.lua. Du kan gøre dette i enhver teksteditor.

Corona SDK har en indbygget 2D-fysikmotor, der gør bygningsspil meget let. Det første trin i at skrive spillet er at initialisere fysikmotoren:

lokal fysik = kræver ("fysik") fysik.start ()

Koden er ret selvforklarende. Modulets fysik indlæses og initialiseres, det tildeles variablen fysik. For at aktivere motorenphysics.start () Hedder.

Derefter opretter vi nogle nyttige variabler, som ikke kun kan bruges til dette enkle spil, men også til mere komplekse spil. halfW og halfH hold værdierne for halvdelen af ​​skærmbredden og halvdelen af ​​skærmhøjden:

halfW = display.indholdBredde * 0,5 halvH = display.indholdshøjde * 0,5

Det Skærm objekt er et foruddefineret objekt, som Corona stiller globalt til rådighed.

Nu kommer det første trin, der faktisk får noget til at ske på skærmen:

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

Samt egenskaber som contentHeight og contentWidth, det Skærm objekt har også mange nyttige funktioner. Det newImage () funktion læser en billedfil (i dette tilfælde en .png) og viser den på skærmen. Displayobjekter gengives i lag, så da dette er det første billede, vi lægger på skærmen, vil det altid være baggrunden (medmindre koden eksplicit gør noget for at ændre det). Parametrene halfW og halfH bed Corona om at placere billedet i midten.

På dette tidspunkt kan du køre koden i emulatoren og se baggrundsbilledet. Hvis du gemmer filen, vil emulatoren bemærke, at filen er ændret og tilbyder at genstarte. Hvis det ikke sker, skal du bruge File-> Relaunch.

Da brugeren vil score point for at tappe på balloner, er vi nødt til at initialisere en scorevariabel og vise score på skærmen:

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

Scoren holdes i den fantasifuldt navngivne variabel selv,og scoreText er det objekt, der viser partituret. Synes godt om newImage (), newText () læg noget på skærmen, i dette tilfælde tekst. Siden scoreText er en global variabel, så kan vi ændre teksten på ethvert tidspunkt. Men vi kommer snart til det.

Du kan genstarte emulatoren og se resultatet af 0-displayet øverst på skærmen.

Venstre: Bare baggrunden. Højre: Baggrund og score.

Nu kommer noget lidt mere vanskeligt, men rolig, jeg forklarer det linje for linje:

lokal funktion balloonTouched (begivenhed) hvis (event.phase == "begyndte") så Kørsel: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = score + 1 scoreText.text = score end end

Koden ovenfor definerer en kaldet funktion balloonTouched () som kaldes hver gang en ballon tappes. Vi har endnu ikke bedt Corona om at kalde denne funktion, hver gang ballonen tappes, det kommer senere, men når vi gør dette er det den funktion, der bliver kaldt.

Tryk eller berør begivenheder har flere faser, mange til at understøtte trækning. Brugeren lægger fingeren på et objekt, dette er den "begyndte" fase. Hvis de glider fingeren i en hvilken som helst retning, er det den "flyttede" fase. Når brugeren løfter fingeren fra skærmen, er det den "afsluttede" fase.

Den første linje af balloonTouched () kontrollerer, at vi er i ”begyndt” -fasen. Vi ønsker at fjerne ballonen og øge scoren så hurtigt som muligt. Hvis funktionen kaldes igen for andre faser som ”afsluttet”, gør funktionen intet.

Inde ihvis sætning er fire kodelinjer. Lad os behandle de to sidste først, da de er enklere.score = score + 1 øger bare scoringen med en ogscoreText.text = score ændrer score-teksten på skærmen for at afspejle den nye score. Husk, hvordan jeg sagde detscoreText var global og kunne fås overalt overalt, det er hvad vi gør her.

Nu til de første to linjer. Når en ballon eller bombe falder nederst på skærmen, findes den stadig i appens hukommelse, det er bare det, at du ikke kan se den. Efterhånden som spillet skrider frem, vil antallet af disse objekter uden for skærmen støt stige. Derfor er vi nødt til at have en mekanisme, der sletter genstande, når de er ude af syne. Det gør vi i en kaldet funktionOffscreen, som vi ikke har skrevet endnu. Denne funktion kaldes en gang pr. Ramme i løbet af spillet. Når en ballon er tappet, skal vi slette den og fjerne det opkald, der kontrollerer, om ballonen er gået væk fra skærmen.

Linjenevent.target:removeSelf () sletter ballonen. Når en berøringshændelse forekommer, er en af ​​parametrene for lytterfunktionenbegivenhed parameter. Den fortæller funktionen om begivenheden og hvilken type begivenhed det er, f.eks.event.phase. Det fortæller os også, hvilken ballon der blev banket,event.target. DetremoveSelf () funktion gør, hvad den siger, den gør, den sletter objektet (i dette tilfælde en ballon).

Linjen der før fjerner “enterframe” -lytteren, som er den funktion, der kaldes hver ramme for at se, om ballonen er faldet ned fra bunden af ​​skærmen. Vi vil se nærmere på det, når vi kommer til at skriveOffscreen lytterfunktion.

Så for at sammenfatte.balloonTouched ()kontrollerer, at dette er begyndelsen på berøringssekvensen. Derefter fjernes "enterframe" -lytteren, som er den funktion, der kaldes for hver ramme for at se, om ballonen er faldet ned fra bunden af ​​skærmen. Den sletter derefter ballonen, øger score og viser den nye score.

Det var for balloner, nu har vi brug for noget lignende til bomber:

lokal funktion bombTouched (begivenhed) hvis (event.phase == "begyndte") så Runtime: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = math.floor (score * 0.5) scoreText.text = score slutning

Som du kan se, er koden meget lignende med undtagelse af, at score snarere end at øge scoren multipliceres med 0,5 (dvs. divideret med 2). Det Math.floor () funktion afrunder score til det nærmeste heltal. Så hvis spilleren havde en score på 3 og bankede på en bombe, ville den nye score være 1 og ikke 1,5.

Jeg nævnte Offscreen () funktion tidligere. Denne funktion kaldes hver ramme for at kontrollere, om et objekt er gået væk fra skærmen. Her er koden:

lokal funktion offscreen (selv, begivenhed) hvis (self.y == nil) derefter returnere ende hvis (self.y> display.contentHeight + 50) derefter Runtime: removeEventListener ("enterFrame", self) self: removeSelf () end end

I computing er der en situation, der er kendt som en race-tilstand. Det er her, to ting vil ske, men det ene kan ske først, eller nogle gange kan det andet ske først. Det er et løb. Nogle raceforhold er uset, fordi den ene ting altid ser ud til at ske først, men de kan forårsage interessante bugs på den ene dag, under de rigtige forhold, sker den anden ting først, og så går systemet i stykker!

Der er en race-betingelse i dette enkle spil, fordi to ting kan ske meget tæt på hinanden: en ballon, der tappes, og Offscreen () funktion kaldes for at se om ballonen er gået væk fra skærmen. Resultatet er, at koden til sletning af ballonen kan kaldes og derefter Offscreen () funktion kaldes (som sker 30 gange pr. sekund). At komme rundt om denne ulige række af begivenheder Offscreen () funktionen skal kontrollere, om y værdien af ​​objektet er nul (null) eller ej. Hvis det er nul så betyder det, at objektet allerede er blevet slettet, så gå videre, dette er ikke de droids, vi leder efter.

Hvis objektet stadig afspilles, skal du kontrollere dets placering, hvis det er gået 50 pixels fra skærmen, slet det og fjern lytteren, så Offscreen () funktion kaldes ikke igen for dette objekt. Koden for at sikre detOffscreen () kaldes hver ramme er en del af den næste del af koden.

Hele forudsætningen for dette spil er, at nye balloner eller bomber fortsætter med at falde ned på skærmen. Derfor har vi brug for en funktion, der skaber enten en ny ballon eller en ny bombe:

lokal funktion addNewBalloonOrBomb () lokal startX = math.random (display.contentWidth * 0.1, display.contentWidth * 0.9) if (math.random (1,5) == 1) derefter - BOMB! lokal bombe = display.newImage ("bomb.png", startX, -300) fysik.addBody (bombe) bomb.enterFrame = offscreen Kørsel: addEventListener ("enterFrame", bombe) bombe: addEventListener ("touch", bombTouched) andet - Ballon lokal ballon = display.newImage ("red_balloon.png", startX, -300) fysik.addBody (ballon) ballon.enterFrame = offscreen Kørsel: addEventListener ("enterFrame", ballon) ballon: addEventListener ("touch", "touch", balloonTouched) slutende

Den første linje i funktionen bestemmer, hvor ballonen vil falde fra på x flyet. Hvis ballonen eller bomben altid faldt i midten, vil det ikke være meget interessant! Såstartx er et tilfældigt tal mellem 10 procent og 90 procent af skærmbredden.

Derefter vælges et tilfældigt tal mellem 1 og 5.Hvis tallet er 1, vil en bombe blive tabt. Hvis det 2, 3, 4 eller 5, vil en ballon blive tabt. Det betyder, at bomber vil blive droppet omkring 20 procent af tiden.

Bomben og ballonkoden er meget ens. Først vises billedet (enten en bombe eller en ballon) vhanewImage(). dens x position erstartx mens det er y position er indstillet til -300, dvs. fra toppen af ​​skærmen. Årsagen hertil er, at vi vil have, at objektet falder uden for skærmområdet i det synlige område og derefter fra bunden. Da vi bruger 2D-fysikmotoren, er det godt at give genstanden en smule af den indledende afstand til at falde, så den kan få en vis hastighed.

Opkaldet tilphysics.addBody () tager billedet indlæst af newImage () og gør det til et objekt i fysikmotoren. Dette er meget magtfuldt. Enhver billedfil kan laves til et organ, der reagerer på tyngdekraften og kollisioner bare ved at ringephysics.addBody ().

De sidste tre linjer i bombe- eller ballonkoden opsætter lytterne. Indstilling afenterFrame egenskab fortæller Corona, hvilken funktion der skal ringes til hver ramme og opkald tilVarighed: addEventListener () sætter det op. Til sidst opkaldet tilballon: addEventListener () fortæller Corona, hvilken funktion der skal kaldes, hvis bomben eller ballonen røres.

Og nu er spillet næsten afsluttet. Vi har bare brug for yderligere to kodelinjer:

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

Den første linje får den allerførste bombe eller ballon til at falde ved eksplicit at kaldeaddNewBalloonOrBomb (). Den anden linje sætter en timer, der ringer opaddNewBalloonOrBomb () hvert halve sekund (500 millisekunder). Det betyder, at en ny ballon eller bombe falder hvert halve sekund.

Du kan nu køre spillet i emulatoren.

Her er den komplette fortegnelse for main.lua, den fulde projektkildekode til dette spil kan findes her på GitHub.

-------------------------------------------------- --------------------------------------- - - Fallende ballon og bombespil - Skrevet af Gary Sims for - ------------------------------------------- ---------------------------------------------- - Start fysik motor lokal fysik = kræver ("fysik") fysik.start () - Beregn halvdelen af ​​skærmens bredde og højde halvW = display.indholdBredde * 0,5 halvH = display.indholdHøjde * 0,5 - Indstil baggrunden lokal bkg = display.newImage ("night_sky.png", halfW, halfH) - Score score = 0 scoreText = display.newText (score, halfW, 10) - Kaldes, når ballonen tappes af spilleren - Forøg score med 1 lokal funktionsballonTouched ( begivenhed) hvis (event.phase == "begyndte") så Runtime: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = score + 1 scoreText.text = score slutning - kaldes når bombe tappes af spilleren - Halvdelen af ​​scoringen som en lokal lokal funktion bombTouched (begivenhed) if (event.phase == "begyndte") derefter Runtime: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = math.floor (score * 0.5) scoreText.text = score slutende - Slet objekter, der er faldet fra nederst på skærmen lokal funktion offscreen (selv, begivenhed) hvis (self.y == nil) derefter returnere slut hvis (self.y> display.contentHeight + 50) derefter Runtime: removeEventListener ("enterFrame", self) self: removeSelf () slutende - Tilføj en ny faldende ballon eller bombe lokal funktion addNewBalloonOrBomb () - Du kan finde red_ballon.png og bomb.png i GitHub repo lokal startX = math.random (display.contentWidth * 0.1, display.contentWidth * 0,9) hvis (matematik.omgang (1,5) == 1) så - BOMB! lokal bombe = display.newImage ("bomb.png", startX, -300) fysik.addBody (bombe) bomb.enterFrame = offscreen Kørsel: addEventListener ("enterFrame", bombe) bombe: addEventListener ("touch", bombTouched) andet - Ballon lokal ballon = display.newImage ("red_balloon.png", startX, -300) fysik.addBody (ballon) ballon.enterFrame = offscreen Kørsel: addEventListener ("enterFrame", ballon) ballon: addEventListener ("touch", "touch", balloonTouched) slutende - Tilføj en ny ballon eller bombe nu addNewBalloonOrBomb () - Bliv ved med at tilføje en ny ballon eller bombe hver 0,5 sekund timer. UdførWithDelay (500, addNewBalloonOrBomb, 0)

Næste skridt

Det næste trin er at spille spillet på en ægte Android-enhed. For at oprette en .apk-fil skal du klikke på File-> Build for Android… og udfylde felterne. Resultatet bliver en .apk-fil, som du kan kopiere til din enhed og derefter installere. Du skal sikre dig, at du har konfigureret din enhed til at tillade installation af app fra ukendte kilder. Amazon har noget god dokumentation om dette, da du også skal indstille dette til at installere Amazon Appstore. Corona har også en guide til, hvordan man signerer, bygger og tester din app på Android-enheder.

Når spillet er installeret på din enhed, er den næste ting at gøre at forbedre spillet. Hvorfor ikke prøve at tilføje en "pop" eller "bang" lyd, for eksempel alt, hvad en ballon eller bombe tappes på. Corona har en API til det:media.playEventSound ().

Eller hvorfor ikke prøve at tilføje en tredje type objekt, siger en super boost, der fordobler den aktuelle score, eller hvad med noget baggrundsmusik?

Wrap-up

At skrive spil med Corona er ret ligetil, fordi SDK håndterer ting som OpenGL, og det inkluderer en indbygget 2D-fysikmotor. Lua er også let at lære og bør ikke være svært for nogen med endda et minimum af programmeringserfaring. Coronalabs websted har masser af dokumentation inklusive masser af guider og tutorials.

På mindre end 100 kodelinjer har vi et arbejdsspil. OK, det vil ikke vinde nogen præmier, men det viser styrken og fleksibiliteten i Corona SDK.

Nogle gange er det vankeligt at have et rigtigt kæledyr. Måke er dit lejlighedkomplek trengt, eller dine kære er allergike. Det er ikke godt, men der er andre alternativer om virtuelle...

Bedste Vivo V15 Pro-sager

Lewis Jackson

Juni 2024

Vivo har aldrig katet ig væk fra at kubbe konvolutten, når det kommer til ine martphone-tilbud. Virkomheden var en af ​​de førte, der ekperimenterede med pop-up elfie-kameraer og finger...

Vi Råder Dig Til At Se