Skriva ditt första Android-spel med Corona SDK

Författare: Randy Alexander
Skapelsedatum: 1 April 2021
Uppdatera Datum: 26 Juni 2024
Anonim
Skriva ditt första Android-spel med Corona SDK - Appar
Skriva ditt första Android-spel med Corona SDK - Appar

Innehåll


Den mest populära kategorin i Google Play Store har alltid varit Spel. Även om vi alla antagligen använder viktiga produktivitetsappar som en webbläsare, en e-postklient och en snabbmeddelanden-app, är fortfarande spel en viktig del av mobilupplevelsen. Så det är ingen överraskning att många som vill lära sig att utveckla för Android vill börja med att göra ett spel. Låt oss också vara ärliga, att skriva ett spel är en hel del roligare än att utveckla en produktivitetsapp!

Det officiella språket för Android är Java och den officiella utvecklingsmiljön är Android Studio. Om du vill undersöka Java så föreslår jag vår Java-grundläggande handledning, och om du vill lära dig att skriva en app med Android Studio så föreslår jag att du kolla in vår handledning om att skriva din första Android-app. Java och Android-studio är dock inte de enda sätten att utveckla för Android. Du kan hitta en översikt över tillgängliga språk och SDK: er i vår guide: Jag vill utveckla Android-appar - Vilka språk ska jag lära mig?


En av SDK: er som nämns i guiden för programmeringsspråk är Corona, en tredjeparts SDK som främst är utformad för att skriva spel. I stället för Java använder Corona Lua, ett snabbt skriptspråk som är lätt att lära men ändå kraftfullt. Corona är dock inte det enda mobila SDK som använder Lua, andra välkända exempel inkluderar Cocos2d-X, Marmalade och Gideros.

ladda ner och installera

För att komma igång med Corona måste du ladda ner och installera SDK. Gå till Corona-webbplatsen och tryck på nedladdningsknappen. Du måste skapa ett konto (som är gratis) innan du kan ladda ner satsen. Om du vill bygga en faktisk .apk-fil istället för att bara köra ditt program i emulatorn, måste du installera Java 7, men du behöver inte installera Android SDK. För att installera Java 7 Development Kit, gå till Oracle's webbplats, leta efter avsnittet "Java SE Development Kit 7u79" och ladda ner versionen till din PC.


När du har installerat Corona måste du aktivera den. Detta är en engångsprocess som är gratis. Starta Corona Simulator och godkänn licensen. Ange e-postadressen och lösenordet som du använde för nedladdningen och klicka på Logga in.

Starta projektet

Klicka på "Nytt projekt" i Corona Simulator. Ange ett namn för din app i fältet "Programnamn:" och lämna resten av inställningarna vid sina standardvärden. Klicka på "OK."

Tre fönster visas nu. De två första är Corona Simulator och Corona Simular Output. Corona öppnar också ett fönster för filutforskare som visar filerna för ditt projekt.

Majoriteten av filerna (cirka 23 av dem) i projektkatalogen är för applikationsikonen! Den viktigaste filen för oss just nu är main.lua, eftersom det är här vi kommer att skriva koden för vår app.

Introduktion till Lua

Innan vi skriver in koden måste vi göra en visselpipningstur till Lua. Lua-tolkaren (kom ihåg att detta är ett skriptspråk, inte ett sammanställt språk) är tillgängligt för Windows, OS X och Linux. Men det är inbyggt i Corona, så för närvarande behöver du inte installera något extra. Det enklaste sättet att spela med Lua är att använda live-demo online.

Du kan hitta många bra tutorials om Lua online och du bör ta en titt på Lua Referenshandbok, Programmering i Lua, The.Lua.Tutorial och Tutorials Point Lua Tutorial.

Här är ett litet Lua-program som visar dig några av de viktigaste funktionerna i Lua:

lokal funktion doubleIt (x) returnera x * 2 ände för i = 1,10,1 do x = doubleIt (i) om (x == 10) tryck sedan ("tio") annars skriv ut (doubleIt (i)) slutänd

Koden ovan visar tre viktiga Lua-konstruktioner: funktioner, slingor och om uttalanden. Funktionen doubleIt () är väldigt enkelt, det fördubblar bara den godkända parametern x.

Huvudkoden är en för slinga från 1 till 10. Det ringer doubleIt () för varje iteration. Om returvärdet är 10 (dvs. när jag är 5) då skriver koden ut "tio", annars skrivs det bara ut resultatet av doubleIt ().

Om du har någon kodningsupplevelse borde exempelkoden vara tillräckligt enkel för att följa. Om du vill lära dig lite grundläggande programmering föreslår jag att du använder några av resurserna länkade ovan för att finslipa dina färdigheter.

Skriva spelet

Att skriva grundläggande program i Corona är enkelt. Du behöver bara bekymra dig om en fil, main.lua, och låt Corona göra alla tunga lyft. Spelet vi ska skriva är ett enkelt "tap" -spel. En ballong eller en bomb kommer att misslyckas på skärmen. Om spelaren knackar på ballongen de gör en poäng, knackar de på en bombe delas poängen med 2, som ett straff. För att skriva koden måste du redigera main.lua. Du kan göra detta i valfri textredigerare.

Corona SDK har en inbyggd 2D-fysikmotor, vilket gör byggnadsspel väldigt enkelt. Det första steget i att skriva spelet är att initiera fysikmotorn:

lokal fysik = kräva ("fysik") fysik.start ()

Koden är ganska självförklarande. Modulfysiken laddas och initialiseras, den tilldelas variabeln fysik. För att aktivera motornphysics.start () kallas.

Därefter skapar vi några användbara variabler som kommer att vara användbara inte bara för detta enkla spel utan också för mer komplexa spel. halfW och halfH håll värdena för hälften av skärmbredden och hälften av skärmens höjd:

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

De visa objekt är ett fördefinierat objekt som Corona gör globalt tillgängligt.

Nu kommer det första steget som faktiskt får något att hända på skärmen:

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

Samt egenskaper som contentHeight och contentWidth, visa objektet har också många användbara funktioner. De ny bild() -funktionen läser en bildfil (i detta fall en .png) och visar den på skärmen. Displayobjekt återges i lager, så eftersom det här är den första bilden vi sätter på skärmen kommer det alltid att vara bakgrunden (såvida inte koden uttryckligen gör något för att ändra det). Parametrarna halfW och halfH ber Corona att placera bilden i mitten.

Vid denna punkt kan du köra koden i emulatorn och se bakgrundsbilden. Om du sparar filen kommer emulatorn att märka att filen har ändrats och erbjuder att starta om. Om det inte händer, använd File-> Relaunch.

Eftersom användaren får poäng för att knacka på ballonger måste vi initiera en poängvariabel och visa poängen på skärmen:

poäng = 0 poängText = display.nyttTekst (poäng, halvW, 10)

Betyget kommer att förvaras i den fantasifullt namngivna variabeln Göra,och scoreText är det objekt som visar poängen. Tycka om ny bild(), newText () sätta något på skärmen, i detta fall text. Eftersom scoreText är en global variabel kan vi ändra texten när som helst. Men vi kommer snart till det.

Du kan starta om emulatorn och se poängen på 0-displayen upptill på skärmen.

Vänster: Bara bakgrunden. Höger: Bakgrund och poäng.

Nu kommer något lite svårare, men oroa dig inte, jag förklarar det rad för rad:

lokal funktion balloonTouched (händelse) if (event.phase == "började") sedan Runtime: removeEventListener ("enterFrame", event.self) event.target:removeSelf () poäng = poäng + 1 poängText.text = poäng slut slut

Koden ovan definierar en funktion som heter balloonTouched () som kommer att kallas varje gång en ballong knackas. Vi har ännu inte sagt till Corona att ringa den här funktionen varje gång ballongen knackas, det kommer senare, men när vi gör det är det den funktion som kommer att ringas.

Tryck på eller tryck på händelser har flera steg, många för att stödja dra. Användaren sätter fingret på ett objekt, detta är den "började" fasen. Om de skjuter fingret i någon riktning är det den "flyttade" fasen. När användaren lyfter fingret från skärmen är det den "slutade" fasen.

Den första raden av balloonTouched () kontrollerar att vi är i "började" -fasen. Vi vill ta bort ballongen och öka poängen så snart som möjligt. Om funktionen kallas igen för andra faser som "slutade" gör funktionen ingenting.

Inutiom uttalande är fyra rader med kod. Låt oss ta itu med de två sista först, eftersom de är enklare.poäng = poäng + 1 ökar bara poängen med en ochscoreText.text = poäng ändrar poängtexten på skärmen för att återspegla den nya poängen. Kom ihåg hur jag sa detscoreText var global och kunde nås var som helst, det är vad vi gör här.

Nu för de två första linjerna. När en ballong eller en bombe faller ner på skärmen finns den fortfarande i appens minne, det är bara så att du inte kan se den. När spelet fortskrider kommer antalet av dessa objekt utanför skärmen att öka stadigt. Därför måste vi ha en mekanism som raderar föremål när de inte är synliga. Vi gör det i en funktion som heterutanför skärmen, som vi inte har skrivit ännu. Den funktionen kommer att kallas en gång per ram under spelet. När en ballong har knackats måste vi ta bort den och ta bort samtalet som kontrollerar om ballongen har gått utanför skärmen.

Linjenevent.target:removeSelf () raderar ballongen. När en beröringshändelse inträffar är en av parametrarna för lyssnarfunktionenhändelse parameter. Den berättar funktionen om händelsen och vilken typ av händelse det är, t.ex.event.phase. Den berättar också vilken ballong som tappades,event.target. DeremoveSelf () funktionen gör vad den säger att den gör, den raderar objektet (i detta fall en ballong).

Linjen därför tar bort "enterframe"-lyssnaren, som är den funktion som kallas varje ram för att se om ballongen har fallit från skärmens botten. Vi kommer att titta mer på det när vi kommer att skrivautanför skärmen lyssnarfunktion.

Så för att sammanfatta.balloonTouched ()kontrollerar att detta är början på beröringssekvensen. Därefter tas bort "enterframe"-lyssnaren, som är den funktion som kallas varje ram för att se om ballongen har fallit från skärmens botten. Den raderar sedan ballongen, ökar poängen och visar den nya poängen.

Det var för ballonger, nu behöver vi något liknande för bomber:

lokal funktion bombTouched (event) if (event.phase == "började") sedan Runtime: removeEventListener ("enterFrame", event.self) event.target:removeSelf () poäng = math.floor (poäng * 0,5) scoreText.text = poäng slutändan

Eftersom du kan se koden är mycket lik med undantag att snarare än att öka poängen multipliceras poängen med 0,5 (dvs dividerat med 2). De Math.floor () funktionen avrundar poängen till närmaste heltal. Så om spelaren hade en poäng på 3 och knackade på en bomb så skulle den nya poängen vara 1 och inte 1,5.

Jag nämnde utanför skärmen () fungerar tidigare. Denna funktion kommer att kallas varje ram för att kontrollera om ett objekt har gått utanför skärmen. Här är koden:

lokal funktion offscreen (själv, händelse) om (self.y == nil) sedan returnera slut om (self.y> display.contentHeight + 50) sedan Runtime: removeEventListener ("enterFrame", self) self: removeSelf () end end

Vid beräkning finns det en situation som kallas ett rasvillkor. Det är här två saker kommer att hända men en kan hända först, eller ibland kan den andra hända först. Det är ett lopp. Vissa rasförhållanden är osynliga eftersom en sak alltid verkar hända först, men de kan orsaka intressanta buggar under den ena dagen, under rätt förhållanden, händer den andra först och sedan går systemet i stycke!

Det finns ett racetillstånd i det här enkla spelet eftersom två saker kan hända mycket nära varandra: en ballong som tappas och utanför skärmen () funktionen kallas för att se om ballongen har gått av skärmen. Resultatet är att koden för att radera ballongen kan anropas och sedan utanför skärmen () funktion kallas (vilket händer som 30 gånger per sekund). För att komma runt denna udda händelseföljd utanför skärmen () funktionen måste kontrollera om y objektets värde är noll (null) eller inte. Om den är noll då betyder det att objektet redan har tagits bort, så gå med, det här är inte de droids vi letar efter.

Om objektet fortfarande spelas, kontrollera sedan dess position, om det har gått 50 pixlar från skärmen, ta bort det och ta bort lyssnaren så att utanför skärmen () funktionen kommer inte att kallas igen för detta objekt. Koden för att se till attutanför skärmen () kallas varje ram är en del av nästa avsnitt av koden.

Hela förutsättningen för detta spel är att nya ballonger eller bomber kommer att fortsätta släppa ner skärmen. Därför behöver vi en funktion som skapar antingen en ny ballong eller en ny bomb:

lokal funktion addNewBalloonOrBomb () lokal startX = math.random (display.contentWidth * 0.1, display.contentWidth * 0.9) if (math.random (1,5) == 1) då - BOMB! lokal bomb = display.newImage ("bomb.png", startX, -300) physics.addBody (bomb) bomb.enterFrame = offscreen Runtime: addEventListener ("enterFrame", bomb) bomb: addEventListener ("touch", bombTouched) annat - Ballong lokal ballong = display.newImage ("red_balloon.png", startX, -300) fysik.addBody (ballong) ballong.enterFrame = offscreen Speltid: addEventListener ("enterFrame", ballong) ballong: addEventListener ("touch", "touch", balloonTouched) slutänd

Den första raden i funktionen avgör var ballongen kommer att släppa från på x plan. Om ballongen eller bomben alltid tappade i mitten, kommer det inte att vara särskilt intressant! Såstartx är ett slumptal mellan 10 procent och 90 procent av skärmbredden.

Därefter väljs ett slumpmässigt antal mellan 1 och 5.Om antalet är 1 kommer en bomb att släppas. Om det 2, 3, 4 eller 5 kommer en ballong att släppas. Det betyder att bomber kommer att släppas cirka 20 procent av tiden.

Bomben och ballongkoden är ganska lika. Först visas bilden (antingen en bomb eller en ballong) medny bild(). Dess x position är den förstartx medan dess y position är inställd på -300, dvs utanför skärmens övre del. Anledningen till det är att vi vill att objektet ska falla utanför skärmområdet till det synliga området och sedan från botten. Eftersom vi använder 2D-fysikmotorn är det bra att ge objektet lite av ett initialt avstånd att falla, så att det kan få lite fart.

Samtalet tillphysics.addBody () tar bilden laddad av ny bild() och förvandlar det till ett objekt i fysikmotorn. Detta är mycket kraftfullt. Alla bildfiler kan göras till en kropp som svarar på allvar och kollisioner bara genom att ringaphysics.addBody ().

De tre sista linjerna i bomben eller ballongkoden skapade lyssnarna. Ställa inenterframe egenskapen berättar Corona vilken funktion att ringa varje ram och samtalen tillSpeltid: addeventlistener () sätter upp det. Slutligen samtalet tillballong: addeventlistener () berättar Corona vilken funktion som ska ringas om bomben eller ballongen berörs.

Och nu är spelet nästan komplett. Vi behöver bara ytterligare två kodrader:

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

Den första raden får den allra första bomben eller ballongen att falla genom att uttryckligen ringaaddNewBalloonOrBomb (). Den andra raden sätter upp en timer som kommer att ringaaddNewBalloonOrBomb () var halv sekund (500 millisekunder). Detta innebär att en ny ballong eller bomb kommer att falla varannan sekund.

Du kan nu köra spelet i emulatorn.

Här är den fullständiga listan för main.lua, hela projektets källkod för detta spel kan hittas här på GitHub.

-------------------------------------------------- --------------------------------------- - - Fallande ballong och bombspel - Skrivet av Gary Sims för - ------------------------------------------- ---------------------------------------------- - Starta fysik motor lokal fysik = kräva ("fysik") fysik.start () - Beräkna halva skärmens bredd och höjd halvW = display.contentWidth * 0.5 halfH = display.contentHeight * 0.5 - Ställ in bakgrunden lokal bkg = display.newImage ("night_sky.png", halfW, halfH) - Poängscore = 0 poängText = display.newText (poäng, halvW, 10) - Kallas när ballongen tappas av spelaren - Öka poängen med 1 lokal funktionsballongTouched ( händelse) if (event.phase == "började") sedan Runtime: removeEventListener ("enterFrame", event.self) event.target:removeSelf () poäng = poäng + 1 poängText.text = poäng slutänd - kallas när bomb är tappad av spelaren - Halva poängen som en straff lokal funktion bombTouched (händelse) if (event.phase == "började") sedan Runtime: removeEventListener ("enterFrame", event.self) event.target:removeSelf () poäng = math.floor (poäng * 0,5) scoreText.text = poäng slutänd - Radera objekt som har fallit av längst ner på skärmen lokalfunktion offscreen (själv, händelse) om (self.y == nil) sedan returnera slut om (self.y> display.contentHeight + 50) sedan Runtime: removeEventListener ("enterFrame", self) self: removeSelf () end end - Lägg till en ny fallande ballong eller bomb lokal funktion addNewBalloonOrBomb () - Du kan hitta red_ballon.png och bomb.png i GitHub repo lokalt startX = math.random (display.contentWidth * 0.1, display.contentWidth * 0,9) if (math.random (1,5) == 1) då - BOMB! lokal bomb = display.newImage ("bomb.png", startX, -300) physics.addBody (bomb) bomb.enterFrame = offscreen Runtime: addEventListener ("enterFrame", bomb) bomb: addEventListener ("touch", bombTouched) annat - Ballong lokal ballong = display.newImage ("red_balloon.png", startX, -300) fysik.addBody (ballong) ballong.enterFrame = offscreen Speltid: addEventListener ("enterFrame", ballong) ballong: addEventListener ("touch", "touch", balloonTouched) end end - Lägg till en ny ballong eller bomb nu addNewBalloonOrBomb () - Fortsätt lägga till en ny ballong eller bomb varje 0,5 sekund timer.performWithDelay (500, addNewBalloonOrBomb, 0)

Nästa steg

Nästa steg är att spela spelet på en riktig Android-enhet. För att bygga en .apk-fil klickar du på File-> Build for Android ... och fyll i fälten. Resultatet blir en .apk-fil som du kan kopiera till din enhet och sedan installera. Du måste se till att du har konfigurerat din enhet för att tillåta installation av app från okända källor. Amazon har lite bra dokumentation om detta eftersom du också måste ställa in detta för att installera Amazon Appstore. Corona har också en guide för hur du registrerar, bygger och testar din app på Android-enheter.

När spelet har installerats på din enhet är nästa sak att göra förbättra spelet. Till exempel, varför inte försöka lägga till en "pop" eller "bang" låter allt som en ballong eller bomb knackar på. Corona har ett API för det:media.playEventSound ().

Eller varför inte försöka lägga till en tredje typ av objekt, säg en super boost som fördubblar den aktuella poängen, eller hur är det med lite bakgrundsmusik?

Sammanfatta

Att skriva spel med Corona är ganska rakt fram eftersom SDK hanterar saker som OpenGL och det innehåller en inbyggd 2D-fysikmotor. Lua är också lätt att lära sig och borde inte vara svårt för någon med ens minsta programmeringsupplevelse. Coronalabs webbplats har massor av dokumentation inklusive massor av guider och handledning.

På mindre än 100 kodrader har vi ett fungerande spel. OK, det kommer inte att vinna några priser, men det visar kraften och flexibiliteten i Corona SDK.

OnePlu 7 Pro har en bra balan mellan lyande hårdvara och pri. Värdepropoition åt idan, det om verkligen binder telefonen är programvaran. Oxygen O tar eto av lager Android medan du...

Även om OnePlu-hårdvara vanligtvi er bra ut - ärkilt den enate Nebula Blue-varianten av OnePlu 7 Pro - kulle de fleta fan hävda att programvaran känd om Oxygen O är det o...

Rekommenderad