Je eerste Android-game schrijven met de Corona SDK

Schrijver: Randy Alexander
Datum Van Creatie: 1 April 2021
Updatedatum: 26 Juni- 2024
Anonim
Writing your first Android game using the Corona SDK!
Video: Writing your first Android game using the Corona SDK!

Inhoud


De meest populaire categorie in de Google Play Store is altijd Games geweest. Hoewel we waarschijnlijk allemaal belangrijke productiviteits-apps gebruiken, zoals een webbrowser, een e-mailclient en een instant messaging-app, blijft gaming nog steeds een belangrijk onderdeel van de mobiele ervaring. Het is dus geen verrassing dat veel mensen die willen leren ontwikkelen voor Android, willen beginnen met het maken van een game. Laten we eerlijk zijn, het schrijven van een game is heel wat leuker dan het ontwikkelen van een productiviteits-app!

De officiële taal van Android is Java en de officiële ontwikkelomgeving is Android Studio. Als je Java wilt bekijken, raad ik je onze basishandleiding voor Java aan en als je wilt leren hoe je een app kunt schrijven met Android Studio, raad ik je aan onze tutorial over het schrijven van je eerste Android-app te bekijken. Java en Android Studio zijn echter niet de enige manieren om te ontwikkelen voor Android. U kunt een overzicht van de beschikbare talen en SDK's vinden in onze gids: Ik wil Android-apps ontwikkelen - Welke talen moet ik leren?


Een van de SDK's die in de programmeertalengids wordt genoemd, is Corona, een SDK van derden die voornamelijk is ontworpen voor het schrijven van spellen. In plaats van Java, gebruikt Corona Lua, een snelle scripttaal die gemakkelijk te leren en toch krachtig is. Corona is echter niet de enige mobiele gaming-SDK die Lua gebruikt, andere bekende voorbeelden zijn Cocos2d-X, Marmalade en Gideros.

Download en installeer

Om aan de slag te gaan met Corona moet u de SDK downloaden en installeren. Ga naar de Corona-website en klik op de downloadknop. U moet een account maken (die gratis is) voordat u de kit kunt downloaden. Als u een echt .apk-bestand wilt bouwen in plaats van alleen uw programma in de emulator uit te voeren, moet u Java 7 installeren, maar u hoeft de Android SDK niet te installeren. Om de Java 7 Development Kit te installeren, gaat u naar de website van Oracle, zoekt u naar het gedeelte "Java SE Development Kit 7u79" en downloadt u de versie voor uw pc.


Nadat u Corona hebt geïnstalleerd, moet u het activeren. Dit is een eenmalig proces dat gratis is. Start de Corona Simulator en ga akkoord met de licentie. Voer het e-mailadres en wachtwoord in dat u voor de download hebt gebruikt en klik op Inloggen.

Het project starten

Klik vanuit de Corona Simulator op "Nieuw project". Voer een naam in voor uw app in het veld "Naam toepassing:" en laat de rest van de instellingen op hun standaardwaarden staan. Klik OK."

Er verschijnen nu drie vensters. De eerste twee zijn de Corona Simulator en de Corona Simular Output. Corona opent ook een bestandsverkenner met de bestanden voor uw project.

Het merendeel van de bestanden (ongeveer 23) in de projectmap zijn voor het toepassingspictogram! Het belangrijkste bestand voor ons nu is main.lua, omdat dit is waar we de code voor onze app zullen schrijven.

Inleiding tot Lua

Voordat we beginnen met het schrijven van de code, moeten we een whistle-stop tour door Lua maken. De Lua-interpreter (onthoud dat dit een scripttaal is, geen gecompileerde taal) is beschikbaar voor Windows, OS X en Linux. Het is echter ingebouwd in Corona, dus op dit moment hoeft u niets extra's te installeren. De eenvoudigste manier om met Lua te spelen is om de online live demo te gebruiken.

Je kunt veel goede tutorials over Lua online vinden en je moet een kijkje nemen in de Lua Reference Manual, Programming in Lua, The.Lua.Tutorial en The Tutorials Point Lua Tutorial.

Hier is een klein Lua-programma dat u enkele van de belangrijkste functies van Lua laat zien:

lokale functie doubleIt (x) retourneer x * 2 end voor i = 1,10,1 do x = doubleIt (i) if (x == 10) print dan ("tien") anders print (doubleIt (i)) end end

De bovenstaande code toont drie belangrijke Lua-constructies: functies, lussen en if-instructies. De functie doubleIt () is heel eenvoudig, het verdubbelt gewoon de doorgegeven parameter X.

De hoofdcode is een voor lus van 1 tot 10. Het roept doubleIt () voor elke iteratie. Als de retourwaarde 10 is (d.w.z. wanneer ik is 5) dan drukt de code "tien" af, anders wordt alleen het resultaat van afgedrukt doubleIt ().

Als u ervaring hebt met coderen, moet de voorbeeldcode eenvoudig genoeg zijn om te volgen. Als je wat basisprogrammering wilt leren, stel ik voor dat je een aantal van de hierboven genoemde bronnen gebruikt om je vaardigheden aan te scherpen.

Het spel schrijven

Het schrijven van basisprogramma's in Corona is eenvoudig. Je hoeft je alleen maar zorgen te maken over één bestand, main.lua, en laat Corona al het zware werk doen. Het spel dat we gaan schrijven is een eenvoudig 'tik'-spel. Een ballon of een bom faalt op het scherm. Als de speler op de ballon tikt, scoort hij een punt, tikt hij op een bom en wordt de score gedeeld door 2, als straf. Om de code te schrijven, moet u deze bewerken main.lua. U kunt dit in elke teksteditor doen.

De Corona SDK heeft een ingebouwde 2D-physics-engine, waardoor het bouwen van games heel eenvoudig is. De eerste stap bij het schrijven van het spel is het initialiseren van de physics-engine:

lokale natuurkunde = vereisen ("natuurkunde") fysica.start ()

De code spreekt redelijk voor zichzelf. De fysica van de module wordt geladen en geïnitialiseerd, deze wordt toegewezen aan de variabele fysica. Om de motor in te schakelenphysics.start () wordt genoemd.

Vervolgens maken we enkele handige variabelen die niet alleen nuttig zijn voor deze eenvoudige game, maar ook voor complexere games. halfW en halfH houd de waarden voor de helft van de schermbreedte en de helft van de schermhoogte vast:

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

De tonen object is een vooraf gedefinieerd object dat Corona wereldwijd beschikbaar maakt.

Nu komt de eerste stap die daadwerkelijk iets op het scherm laat gebeuren:

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

Evenals eigenschappen zoals contentHeight en contentWidth, de tonen object heeft ook veel handige functies. De nieuw beeld() functie leest een afbeeldingsbestand (in dit geval een .png) en geeft dit op het scherm weer. Weergaveobjecten worden in lagen weergegeven, dus omdat dit de eerste afbeelding is die we op het scherm plaatsen, zal dit altijd de achtergrond zijn (tenzij de code expliciet iets doet om dat te veranderen). De parameters halfW en halfH vertel Corona om de afbeelding in het midden te plaatsen.

Op dit punt kunt u de code in de emulator uitvoeren en de achtergrondafbeelding bekijken. Als u het bestand opslaat, merkt de emulator dat het bestand is gewijzigd en wordt aangeboden om opnieuw te starten. Als dat niet gebeurt, gebruik dan Bestand-> Opnieuw opstarten.

Aangezien de gebruiker punten scoort voor het tikken op ballonnen, moeten we een scorevariabele initialiseren en de score op het scherm weergeven:

score = 0 scoreText = display.newText (score, halfW, 10)

De score wordt bewaard in de fantasierijk genoemde variabele scoren,en scoreText is het object dat de score weergeeft. Vind leuk nieuw beeld(), newText () zet iets op het scherm, in dit geval tekst. Sinds scoreText is een globale variabele, kunnen we de tekst op elk moment wijzigen. Maar daar komen we snel op.

U kunt de emulator opnieuw starten en de score van 0 bovenaan het scherm zien verschijnen.

Links: alleen de achtergrond. Rechts: Achtergrond en score.

Nu komt er iets moeilijker, maar maak je geen zorgen, ik zal het regel voor regel uitleggen:

lokale functie balloonTouched (event) if (event.phase == "begon") vervolgens Runtime: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = score + 1 scoreText.text = score einde einde

De bovenstaande code definieert een functie genaamd balloonTouched () die elke keer dat er op een ballon wordt getikt wordt genoemd. We hebben Corona nog niet verteld om deze functie elke keer dat de ballon wordt getikt op te roepen, dat komt later, maar wanneer we dit doen, wordt de functie aangeroepen.

Tik- of aanraakgebeurtenissen hebben verschillende fasen, waarvan vele het slepen ondersteunen. De gebruiker legt zijn vinger op een object, dit is de "begonnen" fase. Als ze hun vinger in een willekeurige richting schuiven, is dat de 'verplaatste' fase. Wanneer de gebruiker zijn vinger van het scherm haalt, is dat de "beëindigde" fase.

De eerste regel van balloonTouched () controleert of we ons in de "begonnen" fase bevinden. We willen de ballon verwijderen en de score zo snel mogelijk verhogen. Als de functie opnieuw wordt aangeroepen voor andere fasen, zoals 'beëindigd', doet de functie niets.

Binnen in deals statement zijn vier coderegels. Laten we eerst de laatste twee behandelen, omdat deze eenvoudiger zijn.score = score + 1 verhoogt de score met één enscoreText.text = score wijzigt de scoretekst op het scherm om de nieuwe score weer te geven. Weet je nog hoe ik dat zeiscoreText was wereldwijd en overal toegankelijk, nou, dat is wat we hier doen.

Nu voor de eerste twee regels. Zodra een ballon of bom van de onderkant van het scherm valt, bestaat deze nog steeds in het geheugen van de app, alleen kunt u deze niet meer zien. Naarmate het spel vordert, zal het aantal van deze off-screen objecten gestaag toenemen. Daarom hebben we een mechanisme nodig dat objecten verwijdert zodra ze uit het zicht zijn. We doen dat in een functie genaamdachterscherm-, die we nog niet hebben geschreven. Die functie wordt tijdens het spel eenmaal per frame aangeroepen. Zodra op een ballon is getikt, moeten we deze verwijderen en de oproep verwijderen die controleert of de ballon van het scherm is verdwenen.

De lijnevent.target:removeSelf () verwijdert de ballon. Wanneer een aanraakgebeurtenis plaatsvindt, is een van de parameters van de luisterfunctie deevenement parameter. Het vertelt de functie over de gebeurtenis en welk type gebeurtenis het is, b.v.event.phase. Het vertelt ons ook welke ballon werd getikt,event.target. DeremoveSelf () functie doet wat het zegt dat het doet, het verwijdert het object (in dit geval een ballon).

De regel daarvoor verwijdert de "enterframe" -luisteraar, de functie die elk frame wordt genoemd om te zien of de ballon van de onderkant van het scherm is gevallen. We zullen dat in meer detail bekijken wanneer we komen om het te schrijvenachterscherm- luisteraar functie.

Dus om samen te vatten.balloonTouched ()controleert of dit het begin is van de aanraakvolgorde. Vervolgens wordt de "enterframe" -luisteraar verwijderd, de functie die elk frame wordt genoemd om te zien of de ballon van de onderkant van het scherm is gevallen. Vervolgens wordt de ballon verwijderd, wordt de score verhoogd en wordt de nieuwe score weergegeven.

Dat was voor ballonnen, nu hebben we iets vergelijkbaars nodig voor bommen:

lokale functie bombTouched (event) if (event.phase == "begon") vervolgens Runtime: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = math.floor (score * 0.5) scoreText.text = score einde einde

Zoals je kunt zien is de code erg vergelijkbaar met de uitzondering dat in plaats van de score te verhogen, de score wordt vermenigvuldigd met 0,5 (d.w.z. gedeeld door 2). De math.floor () functie rondt de score naar beneden af ​​op het dichtstbijzijnde gehele getal. Dus als de speler een score van 3 had en op een bom tikte, dan zou de nieuwe score 1 zijn en niet 1,5.

Ik noemde de offscreen () functie eerder. Deze functie wordt elk frame genoemd om te controleren of een object van het scherm is verdwenen. Hier is de code:

lokale functie offscreen (self, event) if (self.y == nihil) retourneer vervolgens if (self.y> display.contentHeight + 50) vervolgens Runtime: removeEventListener ("enterFrame", self) self: removeSelf () end end

Bij computergebruik is er een situatie die bekend staat als een race-conditie. Dit is waar twee dingen gaan gebeuren, maar de eerste kan eerst gebeuren, of soms kan de andere eerst gebeuren. Het is een race. Sommige race-omstandigheden zijn ongezien omdat het ene altijd lijkt te gebeuren, maar ze kunnen op die ene dag interessante bugs veroorzaken, onder de juiste omstandigheden gebeurt het andere eerst en dan breekt het systeem!

Er is een raceconditie in dit eenvoudige spel omdat twee dingen heel dicht bij elkaar kunnen gebeuren: een te tikken ballon en de offscreen () wordt opgeroepen om te zien of de ballon van het scherm is verdwenen. Het resultaat is dat de code om de ballon te verwijderen kan worden aangeroepen en vervolgens de offscreen () functie wordt genoemd (wat gebeurt als 30 keer per seconde). Om deze vreemde reeks gebeurtenissen te omzeilen, is de offscreen () functie moet controleren of de Y waarde van het object is nul (null) of niet. Als het is nul dan betekent dit dat het object al is verwijderd, dus ga verder, dit zijn niet de droids die we zoeken.

Als het object nog steeds in het spel is, controleer dan de positie, als het 50 pixels van het scherm is verdwenen, verwijder het en verwijder de luisteraar zodat de offscreen () functie wordt niet opnieuw aangeroepen voor dit object. De code om ervoor te zorgen datoffscreen () wordt elk frame genoemd, maakt deel uit van het volgende gedeelte van de code.

Het hele uitgangspunt van dit spel is dat nieuwe ballonnen of bommen op het scherm blijven vallen. Daarom hebben we een functie nodig die een nieuwe ballon of een nieuwe bom maakt:

lokale functie addNewBalloonOrBomb () lokale startX = math.random (display.contentWidth * 0.1, display.contentWidth * 0.9) if (math.random (1,5) == 1) dan - BOMB! local bomb = display.newImage ("bomb.png", startX, -300) physics.addBody (bomb) bomb.enterFrame = offscreen Runtime: addEventListener ("enterFrame", bomb) bomb: addEventListener ("touch", bombTouched) other - Balloon local balloon = display.newImage ("red_balloon.png", startX, -300) physics.addBody (balloon) balloon.enterFrame = offscreen Runtime: addEventListener ("enterFrame", balloon) balloon: addEventListener ("touch", balloonTouched) end end

De eerste regel van de functie bepaalt waar de ballon zal vallen op de X vlak. Als de ballon of bom altijd in het midden valt, is dat niet erg interessant! ZostartX is een willekeurig getal tussen 10 en 90 procent van de schermbreedte.

Vervolgens wordt een willekeurig nummer gekozen tussen 1 en 5.Als het nummer 1 is, valt er een bom. Als het 2, 3, 4 of 5 is, valt er een ballon. Dit betekent dat bommen ongeveer 20 procent van de tijd zullen vallen.

De bom- en balloncode lijken veel op elkaar. Eerst wordt de afbeelding (een bom of een ballon) weergegeven metnieuw beeld(). Haar X positie is die vanstartX terwijl het is Y positie is ingesteld op -300, d.w.z. boven aan het scherm. De reden daarvoor is dat we willen dat het object van buiten het schermgebied in het zichtbare gebied valt en vervolgens van de bodem af. Omdat we de 2D physics engine gebruiken, is het goed om het object een beetje een initiële afstand tot vallen te geven, zodat het wat snelheid kan krijgen.

De oproep totphysics.addBody () neemt de afbeelding geladen door nieuw beeld() en verandert het in een object in de fysica-engine. Dit is erg krachtig. Van elk afbeeldingsbestand kan een lichaam worden gemaakt dat op zwaartekracht en botsingen reageert door gewoon te bellenphysics.addBody ().

De laatste drie regels van de bom of balloncode zetten de luisteraars op. Het instellen vanenterFrame eigenschap vertelt Corona welke functie elk frame en de aanroep moet oproepenRuntime: addEventListener () zet het op. Ten slotte de oproep totballon: addEventListener () vertelt Corona welke functie moet worden opgeroepen als de bom of ballon wordt aangeraakt.

En nu is het spel bijna voltooid. We hebben nog twee regels code nodig:

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

De eerste regel laat de eerste bom of ballon vallen door expliciet te bellenaddNewBalloonOrBomb (). Op de tweede regel wordt een timer ingesteld die wordt opgeroepenaddNewBalloonOrBomb () elke halve seconde (500 milliseconden). Dit betekent dat elke halve seconde een nieuwe ballon of bom valt.

Je kunt het spel nu in de emulator spelen.

Hier is de complete lijst voor main.lua, de volledige projectbroncode voor deze game is hier te vinden op GitHub.

-------------------------------------------------- --------------------------------------- - - Vallend ballon- en bomspel - Geschreven door Gary Sims voor - ------------------------------------------- ---------------------------------------------- -- Start de physics engine local physics = vereisen ("physics") physics.start () - Bereken de helft van de schermbreedte en hoogte halfW = display.contentWidth * 0.5 halfH = display.contentHeight * 0.5 - Stel de lokale achtergrond in bkg = display.newImage ("night_sky.png", halfW, halfH) - Score score = 0 scoreText = display.newText (score, halfW, 10) - Oproep wanneer de ballon door de speler wordt getikt - Score verhogen met 1 lokale functie balloonTouched ( event) if (event.phase == "begon") en vervolgens Runtime: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = score + 1 scoreText.text = score einde einde - Genoemd wanneer de bom wordt afgetapt door de speler - De helft van de score als een penalty lokale functie bombTouched (event) if (event.phase == "begon") en vervolgens Runtime: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = math.floor (score * 0.5) scoreText.text = score einde einde - Verwijder objecten die van de onder aan het scherm lokale functie offscreen (zelf, gebeurtenis) if (self.y == nihil) retourneer vervolgens einde if (self.y> display.contentHeight + 50) vervolgens Runtime: removeEventListener ("enterFrame", self) self: removeSelf () end end - Voeg een nieuwe vallende ballon of bom lokale functie toe addNewBalloonOrBomb () - Je kunt red_ballon.png en bomb.png vinden in de GitHub repo local startX = math.random (display.contentWidth * 0.1, display.contentWidth * 0.9) if (math.random (1,5) == 1) dan - BOM! local bomb = display.newImage ("bomb.png", startX, -300) physics.addBody (bomb) bomb.enterFrame = offscreen Runtime: addEventListener ("enterFrame", bomb) bomb: addEventListener ("touch", bombTouched) other - Balloon local balloon = display.newImage ("red_balloon.png", startX, -300) physics.addBody (balloon) balloon.enterFrame = offscreen Runtime: addEventListener ("enterFrame", balloon) balloon: addEventListener ("touch", balloonTouched) end end - Voeg nu een nieuwe ballon of bom toe addNewBalloonOrBomb () - Blijf elke 0,5 seconden een nieuwe ballon of bom toevoegen timer.performWithDelay (500, addNewBalloonOrBomb, 0)

Volgende stappen

De volgende stap is om het spel op een echt Android-apparaat te spelen. Om een ​​APK-bestand te maken, klikt u op Bestand-> Bouwen voor Android ... en vult u de velden in. Het resultaat is een .apk-bestand dat u naar uw apparaat kunt kopiëren en vervolgens kunt installeren. U moet ervoor zorgen dat u uw apparaat hebt geconfigureerd om de installatie van app van onbekende bronnen toe te staan. Amazon heeft hier een aantal goede documentatie over, omdat je dit ook moet instellen om de Amazon Appstore te installeren. Corona heeft ook een handleiding voor het ondertekenen, bouwen en testen van uw app op Android-apparaten.

Nadat de game met succes op uw apparaat is geïnstalleerd, is het volgende wat u moet doen de game verbeteren. Waarom zou u bijvoorbeeld niet proberen een "knal" of "knal" toe te voegen, alles wat een ballon of bom tikt. Corona heeft daarvoor een API:media.playEventSound ().

Of waarom probeert u niet een derde type object toe te voegen, bijvoorbeeld een superboost die de huidige score verdubbelt, of wat dacht u van wat achtergrondmuziek?

Afronden

Het schrijven van games met Corona is vrij eenvoudig omdat de SDK zaken als OpenGL afhandelt en het een ingebouwde 2D physics-engine bevat. Ook is Lua gemakkelijk te leren en zou niet moeilijk moeten zijn voor iedereen met zelfs minimale programmeerervaring. De Coronalabs-website heeft veel documentatie, waaronder veel handleidingen en zelfstudies.

In minder dan 100 regels code hebben we een werkspel. OK, het gaat geen prijzen winnen, maar het toont de kracht en flexibiliteit van de Corona SDK.

De beste romantiekfilms op Hulu

Monica Porter

Juni- 2024

Voor ommigen zijn romantiekfilm niet ander. Of ze nu een relatie of ingle hebben, de romantici onder on krijgen een onmiddellijke uitbarting van emotionele inteniteit uit romantiekfilm. Gelukkig voor ...

De Total War-erie game zijn enkele van de meet populaire en legendariche al het gaat om het pelen van militaire trategieën. In die erie taat Rome: Total War al een van de allerbete....

Aanbevolen