Schreiben Sie Ihr erstes Android-Spiel mit dem Corona SDK

Autor: Randy Alexander
Erstelldatum: 1 April 2021
Aktualisierungsdatum: 26 Juni 2024
Anonim
Android Apps programmieren - Erste eigene App entwickeln [#01] [HD] (German)
Video: Android Apps programmieren - Erste eigene App entwickeln [#01] [HD] (German)

Inhalt


Die beliebteste Kategorie im Google Play Store waren schon immer Spiele. Obwohl wir alle wahrscheinlich wichtige Produktivitäts-Apps wie einen Webbrowser, einen E-Mail-Client und eine Instant Messaging-App verwenden, bleibt das Spielen ein wichtiger Bestandteil der mobilen Erfahrung. Kein Wunder also, dass viele Leute, die lernen möchten, sich für Android zu entwickeln, zunächst ein Spiel entwickeln möchten. Um ehrlich zu sein, macht das Schreiben eines Spiels eine ganze Menge mehr Spaß als die Entwicklung einer Produktivitäts-App!

Die offizielle Sprache von Android ist Java und die offizielle Entwicklungsumgebung ist Android Studio. Wenn Sie sich mit Java beschäftigen möchten, schlage ich Ihnen unser Tutorial mit den Java-Grundlagen vor. Wenn Sie lernen möchten, wie man eine App mit Android Studio schreibt, lesen Sie unser Tutorial zum Schreiben Ihrer ersten Android-App. Java und Android Studio sind jedoch nicht die einzigen Entwicklungsmöglichkeiten für Android. Eine Übersicht der verfügbaren Sprachen und SDKs finden Sie in unserem Handbuch: Ich möchte Android Apps entwickeln - Welche Sprachen soll ich lernen?


Eines der im Programmiersprachen-Handbuch erwähnten SDKs ist Corona, ein SDK eines Drittanbieters, das hauptsächlich zum Schreiben von Spielen entwickelt wurde. Anstelle von Java verwendet Corona Lua, eine schnelle Skriptsprache, die einfach zu erlernen und dennoch leistungsstark ist. Corona ist jedoch nicht das einzige SDK für mobile Spiele, das Lua verwendet. Andere bekannte Beispiele sind Cocos2d-X, Marmalade und Gideros.

Herunterladen und installieren

Um mit Corona zu beginnen, müssen Sie das SDK herunterladen und installieren. Gehen Sie zur Corona-Website und klicken Sie auf den Download-Button. Sie müssen ein kostenloses Konto erstellen, bevor Sie das Kit herunterladen können. Wenn Sie eine tatsächliche APK-Datei erstellen möchten, anstatt Ihr Programm nur im Emulator auszuführen, müssen Sie Java 7 installieren, das Android SDK muss jedoch nicht installiert werden. Um das Java 7 Development Kit zu installieren, rufen Sie die Oracle-Website auf, suchen Sie den Abschnitt "Java SE Development Kit 7u79" und laden Sie die Version für Ihren PC herunter.


Sobald Sie Corona installiert haben, müssen Sie es aktivieren. Dies ist ein einmaliger Prozess, der kostenlos ist. Starten Sie den Corona Simulator und stimmen Sie der Lizenz zu. Geben Sie die E-Mail-Adresse und das Passwort ein, die Sie für den Download verwendet haben, und klicken Sie auf Anmelden.

Projekt starten

Klicken Sie im Corona Simulator auf "Neues Projekt". Geben Sie einen Namen für Ihre App in das Feld "Anwendungsname:" ein und belassen Sie die restlichen Einstellungen auf ihren Standardwerten. OK klicken."

Es erscheinen drei Fenster. Die ersten beiden sind der Corona Simulator und der Corona Simular Output. Corona öffnet auch ein Datei-Explorer-Fenster, in dem die Dateien für Ihr Projekt angezeigt werden.

Die meisten Dateien (davon 23) im Projektverzeichnis sind für das Anwendungssymbol! Die wichtigste Datei für uns ist momentan main.luaHier schreiben wir den Code für unsere App.

Einführung in Lua

Bevor wir mit dem Schreiben des Codes beginnen, müssen wir eine Tour durch Lua machen. Der Lua-Interpreter (denken Sie daran, dies ist eine Skriptsprache, keine kompilierte Sprache) ist für Windows, OS X und Linux verfügbar. Da es jedoch in Corona integriert ist, müssen Sie zu diesem Zeitpunkt keine zusätzlichen Komponenten installieren. Der einfachste Weg, mit Lua zu spielen, ist die Online-Live-Demo.

Sie finden viele gute Tutorials zu Lua online und sollten sich das Lua-Referenzhandbuch, Programmieren in Lua, The.Lua.Tutorial und The Tutorials Point Lua Tutorial ansehen.

Hier ist ein kleines Lua-Programm, das Ihnen einige der wichtigsten Funktionen von Lua zeigt:

lokale Funktion doubleIt (x) liefert x * 2 end für i = 1,10,1 do x = doubleIt (i) if (x == 10) dann print ("ten") else print (doubleIt (i)) end end

Der obige Code zeigt drei wichtige Lua-Konstrukte: Funktionen, Schleifen und if-Anweisungen. Die Funktion doubleIt () ist sehr einfach, es verdoppelt nur den übergebenen Parameter x.

Der Hauptcode ist a zum Schleife von 1 bis 10. Es ruft doubleIt () für jede Iteration. Wenn der Rückgabewert 10 ist (d. H. Wenn ich ist 5) dann druckt der Code "zehn" aus, andernfalls druckt er nur das Ergebnis aus doubleIt ().

Wenn Sie Erfahrung mit Codierung haben, sollte der Beispielcode leicht zu befolgen sein. Wenn Sie grundlegende Programmierkenntnisse erlernen möchten, empfehlen wir Ihnen, einige der oben genannten Ressourcen zu verwenden, um Ihre Fähigkeiten zu verbessern.

Das Spiel schreiben

Das Schreiben von Grundprogrammen in Corona ist einfach. Sie müssen sich nur um eine Datei kümmern, main.lua, und lassen Sie Corona das ganze schwere Heben tun. Das Spiel, das wir schreiben werden, ist ein einfaches Tippspiel. Ein Ballon oder eine Bombe fallen auf dem Bildschirm aus. Wenn der Spieler auf den Ballon tippt, den er punktet, tippt er auf eine Bombe, dann wird die Punktzahl als Strafe durch 2 geteilt. Um den Code zu schreiben, müssen Sie ihn bearbeiten main.lua. Sie können dies in einem beliebigen Texteditor tun.

Das Corona SDK verfügt über eine integrierte 2D-Physik-Engine, die das Erstellen von Spielen sehr einfach macht. Der erste Schritt beim Schreiben des Spiels besteht darin, die Physik-Engine zu initialisieren:

lokale Physik = erfordern ("Physik") physics.start ()

Der Code ist ziemlich selbsterklärend. Das Modul Physik wird geladen und initialisiert, es wird der Variablen zugeordnet Physik. So aktivieren Sie den Motorphysics.start () wird genannt.

Als nächstes erstellen wir einige hilfreiche Variablen, die nicht nur für dieses einfache Spiel, sondern auch für komplexere Spiele nützlich sind. halfW und halfH Halten Sie die Werte für die Hälfte der Bildschirmbreite und die Hälfte der Bildschirmhöhe:

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

Das Anzeige object ist ein vordefiniertes Objekt, das Corona global zur Verfügung stellt.

Nun kommt der erste Schritt, der tatsächlich etwas auf dem Bildschirm geschehen lässt:

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

Sowie Eigenschaften wie contentHeight und contentWidth, das Anzeige Objekt hat auch viele nützliche Funktionen. Das neues Bild() Die Funktion liest eine Bilddatei (in diesem Fall eine .png-Datei) und zeigt sie auf dem Bildschirm an. Anzeigeobjekte werden in Ebenen gerendert. Da dies also das erste Bild ist, das wir auf den Bildschirm bringen, ist es immer der Hintergrund (es sei denn, der Code ändert dies ausdrücklich). Die Parameter halfW und halfH sag Corona, dass sie das Bild in die Mitte legen soll.

Zu diesem Zeitpunkt können Sie den Code im Emulator ausführen und das Hintergrundbild anzeigen. Wenn Sie die Datei speichern, stellt der Emulator fest, dass die Datei geändert wurde, und bietet einen Neustart an. Wenn dies nicht der Fall ist, verwenden Sie Datei-> Neu starten.

Da der Benutzer Punkte für das Antippen von Luftballons erzielt, müssen wir eine Bewertungsvariable initialisieren und die Bewertung auf dem Bildschirm anzeigen:

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

Die Punktzahl wird in der einfallsreich benannten Variablen gespeichert Ergebnis,und scoreText ist das Objekt, das die Partitur anzeigt. Mögen neues Bild(), newText () Stellen Sie etwas auf den Bildschirm, in diesem Fall Text. Schon seit scoreText Wenn es sich um eine globale Variable handelt, können wir den Text jederzeit ändern. Aber wir werden bald darauf zurückkommen.

Sie können den Emulator neu starten und die Punktzahl 0 oben auf dem Bildschirm anzeigen.

Links: Nur der Hintergrund. Rechts: Hintergrund und Partitur.

Jetzt ist etwas schwieriger, aber keine Sorge, ich werde es Zeile für Zeile erklären:

lokale Funktion balloonTouched (event) if (event.phase == "started") then Laufzeit: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = score + 1 scoreText.text = score end end

Der obige Code definiert eine aufgerufene Funktion balloonTouched () Dies wird jedes Mal aufgerufen, wenn ein Ballon angetippt wird. Wir haben Corona noch nicht angewiesen, diese Funktion jedes Mal aufzurufen, wenn auf den Ballon getippt wird. Diese Funktion wird jedoch später aufgerufen, wenn wir dies tun.

Tipp- oder Berührungsereignisse bestehen aus mehreren Phasen, von denen viele das Ziehen unterstützen. Der Benutzer legt den Finger auf ein Objekt, dies ist die „begonnene“ Phase. Wenn sie mit dem Finger in eine Richtung gleiten, ist dies die „bewegte“ Phase. Wenn der Benutzer den Finger vom Bildschirm hebt, ist dies die „beendete“ Phase.

Die erste Zeile von balloonTouched () prüft, ob wir in der Phase „begonnen“ sind. Wir wollen den Ballon entfernen und die Punktzahl so schnell wie möglich erhöhen. Wenn die Funktion für andere Phasen wie „beendet“ erneut aufgerufen wird, führt die Funktion nichts aus.

In derob Anweisung sind vier Codezeilen. Lassen Sie uns die letzten beiden zuerst behandeln, da sie einfacher sind.score = score + 1 erhöht nur die Punktzahl um eins undscoreText.text = score Ändert den Text der Partitur auf dem Bildschirm, um die neue Partitur wiederzugeben. Erinnern Sie sich, wie ich das gesagt habescoreText war global und konnte überall zugegriffen werden, nun, das ist, was wir hier tun.

Nun zu den ersten beiden Zeilen. Sobald ein Ballon oder eine Bombe in den unteren Bereich des Bildschirms fällt und sich noch im Speicher der App befindet, können Sie sie nur nicht mehr sehen. Im Verlauf des Spiels wird die Anzahl dieser Objekte außerhalb des Bildschirms stetig zunehmen. Deshalb brauchen wir einen Mechanismus, der Objekte löscht, sobald sie außer Sicht sind. Wir machen das in einer Funktion namensoffscreen, die wir noch nicht geschrieben haben. Diese Funktion wird während des Spiels einmal pro Frame aufgerufen. Sobald ein Ballon angetippt wurde, müssen wir ihn löschen und den Anruf entfernen, der prüft, ob der Ballon vom Bildschirm verschwunden ist.

Die Linieevent.target:removeSelf () löscht die Sprechblase. Wenn ein Berührungsereignis auftritt, ist einer der Parameter der Zuhörerfunktion derVeranstaltung Parameter. Es teilt der Funktion mit, um welches Ereignis es sich handelt und um welche Art von Ereignis es sich handelt, z.event.phase. Es sagt uns auch, welcher Ballon getippt wurde,event.target. DasremoveSelf () Die Funktion macht, was sie sagt, sie löscht das Objekt (in diesem Fall eine Sprechblase).

Die Zeile davor entfernt den Listener "enterframe". Hierbei handelt es sich um die Funktion, die bei jedem Frame aufgerufen wird, um festzustellen, ob die Sprechblase vom unteren Bildschirmrand gefallen ist. Wir werden uns das genauer ansehen, wenn wir kommen, um das zu schreibenoffscreen Listener-Funktion.

Also, um es noch einmal zusammenzufassen.balloonTouched ()prüft, ob dies der Beginn der Berührungssequenz ist. Anschließend wird der Listener "enterframe" entfernt. Hierbei handelt es sich um die Funktion, die bei jedem Frame aufgerufen wird, um festzustellen, ob die Sprechblase vom unteren Bildschirmrand gefallen ist. Anschließend wird die Sprechblase gelöscht, die Punktzahl erhöht und die neue Punktzahl angezeigt.

Das war für Luftballons, jetzt brauchen wir etwas Ähnliches für Bomben:

lokale Funktion bombTouched (event) if (event.phase == "started") then Laufzeit: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = math.floor (score * 0.5) scoreText.text = Punktzahl Ende Ende

Wie Sie sehen, ist der Code sehr ähnlich, mit der Ausnahme, dass die Punktzahl nicht erhöht, sondern mit 0,5 multipliziert (d. H. Durch 2 geteilt) wird. Das math.floor () Funktion rundet die Punktzahl auf die nächste ganze Zahl ab. Wenn der Spieler also eine Punktzahl von 3 hätte und eine Bombe getippt hätte, wäre die neue Punktzahl 1 und nicht 1,5.

Ich habe das erwähnt offscreen () früher funktionieren. Diese Funktion wird in jedem Frame aufgerufen, um zu überprüfen, ob ein Objekt vom Bildschirm verschwunden ist. Hier ist der Code:

lokale Funktion offscreen (self, event) if (self.y == nil) dann return end if (self.y> display.contentHeight + 50) dann Laufzeit: removeEventListener ("enterFrame", self) self: removeSelf () end end

Beim Rechnen gibt es eine Situation, die als Rennbedingung bekannt ist. Hier werden zwei Dinge passieren, aber eines könnte zuerst passieren, oder manchmal könnte das andere zuerst passieren. Es ist ein Rennen. Einige Rennbedingungen sind unsichtbar, weil eines immer zuerst zu passieren scheint, aber sie können an einem Tag interessante Fehler verursachen, unter den richtigen Bedingungen passiert das andere zuerst und dann bricht das System!

Es gibt eine Racebedingung in diesem einfachen Spiel, weil zwei Dinge sehr nahe beieinander passieren können: ein Ballon, der getippt wird, und der offscreen () Funktion, die aufgerufen wird, um festzustellen, ob die Sprechblase vom Bildschirm verschwunden ist. Das Ergebnis ist, dass der Code zum Löschen der Sprechblase aufgerufen werden kann und dann die offscreen () Funktion wird aufgerufen (was etwa 30 Mal pro Sekunde geschieht). Um diese ungerade Abfolge von Ereignissen zu umgehen, wird der offscreen () Funktion muss prüfen, ob die y Wert des Objekts ist Null (null) oder nicht. Wenn es so ist Null Dann bedeutet dies, dass das Objekt bereits gelöscht wurde. Bewegen Sie sich also weiter, dies sind nicht die Droiden, nach denen wir suchen.

Wenn das Objekt noch im Spiel ist, überprüfen Sie seine Position. Wenn es 50 Pixel vom Bildschirm entfernt ist, löschen Sie es und entfernen Sie den Hörer, damit der offscreen () Funktion wird für dieses Objekt nicht erneut aufgerufen. Der Code, um dies sicherzustellenoffscreen () heißt, jeder Frame ist Teil des nächsten Codeabschnitts.

Die ganze Voraussetzung dieses Spiels ist, dass weiterhin neue Luftballons oder Bomben auf den Bildschirm fallen. Deshalb brauchen wir eine Funktion, die entweder einen neuen Ballon oder eine neue Bombe erzeugt:

lokale Funktion addNewBalloonOrBomb () local startX = math.random (display.contentWidth * 0.1, display.contentWidth * 0.9) if (math.random (1,5) == 1) then - BOMB! local bomb = display.newImage ("bomb.png", startX, -300) physics.addBody (bomb) bomb.enterFrame = offscreen Laufzeit: addEventListener ("enterFrame", Bombe) bomb: addEventListener ("touch", bombTouched) else - Balloon local balloon = display.newImage ("red_balloon.png", startX, -300) physics.addBody (ballon) balloon.enterFrame = offscreen Laufzeit: addEventListener ("enterFrame", ballon) balloon: addEventListener ("touch", balloonTouched) Ende Ende

Die erste Zeile der Funktion entscheidet, von wo der Ballon auf dem fallen soll x Ebene. Wenn der Ballon oder die Bombe immer in die Mitte gefallen ist, ist das nicht sehr interessant! SostartX ist eine Zufallszahl zwischen 10 und 90 Prozent der Bildschirmbreite.

Als nächstes wird eine Zufallszahl zwischen 1 und 5 ausgewählt.Wenn die Zahl 1 ist, wird eine Bombe abgeworfen. Wenn es 2, 3, 4 oder 5 ist, wird ein Ballon fallen gelassen. Dies bedeutet, dass Bomben in etwa 20 Prozent der Fälle abgeworfen werden.

Der Bomben- und Balloncode sind ziemlich ähnlich. Zuerst wird das Bild (entweder eine Bombe oder ein Ballon) mit angezeigtneues Bild(). Es ist x Position ist die vonstartX während es ist y Die Position ist auf -300 eingestellt, d. h. am oberen Bildschirmrand. Der Grund dafür ist, dass das Objekt von außerhalb des Bildschirmbereichs in den sichtbaren Bereich und dann nach unten fallen soll. Da wir die 2D-Physik-Engine verwenden, ist es gut, dem Objekt eine anfängliche Fallstrecke zu geben, damit es etwas an Geschwindigkeit gewinnt.

Der Anruf nachphysics.addBody () Nimmt das von geladene Bild auf neues Bild() und verwandelt es in ein Objekt in der Physik-Engine. Das ist sehr mächtig. Jede Bilddatei kann zu einem Körper gemacht werden, der auf Schwerkraft und Kollisionen reagiert, indem er einfach aufruftphysics.addBody ().

Die letzten drei Zeilen des Bomben- oder Balloncodes richten die Zuhörer ein. Einstellen derenterFrame Diese Eigenschaft teilt Corona mit, welche Funktion für jeden Frame und den Aufruf von verwendet werden sollLaufzeit: addEventListener () stellt es auf. Zum Schluss der Aufruf anSprechblase: addEventListener () teilt Corona mit, welche Funktion aufgerufen werden soll, wenn die Bombe oder der Ballon berührt wird.

Und jetzt ist das Spiel fast abgeschlossen. Wir brauchen nur noch zwei Codezeilen:

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

Die erste Zeile lässt die erste Bombe oder den ersten Ballon fallen, indem sie explizit aufruftaddNewBalloonOrBomb (). Die zweite Zeile richtet einen Timer ein, der aufruftaddNewBalloonOrBomb () jede halbe Sekunde (500 Millisekunden). Dies bedeutet, dass jede halbe Sekunde ein neuer Ballon oder eine neue Bombe fällt.

Sie können das Spiel jetzt im Emulator ausführen.

Hier ist die komplette Liste für main.lua, der vollständige Quellcode des Projekts für dieses Spiel ist hier auf GitHub zu finden.

-------------------------------------------------- --------------------------------------- - - Fallendes Ballon- und Bombenspiel - Geschrieben von Gary Sims für ------------------------------------------- ---------------------------------------------- -- Starte das physics engine local physics = require ("physics") physics.start () - Berechnen Sie die Hälfte der Bildschirmbreite und -höhe. halfW = display.contentWidth * 0.5 halfH = display.contentHeight * 0.5 - Setzen Sie den lokalen Hintergrund. bkg = display.newImage ("night_sky.png", halfW, halfH) - Score score = 0 scoreText = display.newText (score, halfW, 10) - Wird aufgerufen, wenn der Spieler auf den Ballon tippt - Erhöhe den Score um 1 lokale Funktion balloonTouched ( event) if (event.phase == "started") then Laufzeit: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = score + 1 scoreText.text = score end end - Wird aufgerufen, wenn der Bombe wird vom Spieler getippt - Die Hälfte der Punktzahl als lokale Straffunktion bombTouched (event) if (event.phase == "hat begonnen") dann Laufzeit: removeEventListener ("enterFrame", event.self) event.target:removeSelf () score = math.floor (score * 0.5) scoreText.text = score end end - Objekte löschen, die vom am unteren Bildschirmrand lokale Funktion offscreen (self, event) if (self.y == nil) dann return end if (self.y> display.contentHeight + 50) dann Laufzeit: removeEventListener ("enterFrame", self) self: removeSelf () end end - Füge eine neue fallende Ballon- oder Bombenlokalfunktion hinzu addNewBalloonOrBomb () - Du findest red_ballon.png und bomb.png im GitHub-Repo local startX = math.random (display.contentWidth * 0.1, display.contentWidth * 0.9) if (math.random (1,5) == 1) then - BOMB! local bomb = display.newImage ("bomb.png", startX, -300) physics.addBody (bomb) bomb.enterFrame = offscreen Laufzeit: addEventListener ("enterFrame", Bombe) bomb: addEventListener ("touch", bombTouched) else - Sprechblase local balloon = display.newImage ("red_balloon.png", startX, -300) physics.addBody (Sprechblase) balloon.enterFrame = offscreen Laufzeit: addEventListener ("enterFrame", Sprechblase) Sprechblase: addEventListener ("touch", balloonTouched) end end - Füge jetzt einen neuen Ballon oder eine neue Bombe hinzu addNewBalloonOrBomb () - Füge weiterhin alle 0,5 Sekunden einen neuen Ballon oder eine neue Bombe hinzu timer.performWithDelay (500, addNewBalloonOrBomb, 0)

Nächste Schritte

Der nächste Schritt ist, das Spiel auf einem echten Android-Gerät zu spielen. Um eine APK-Datei zu erstellen, klicken Sie auf Datei-> Erstellen für Android… und füllen Sie die Felder aus. Das Ergebnis ist eine APK-Datei, die Sie auf Ihr Gerät kopieren und dann installieren können. Sie müssen sicherstellen, dass Sie Ihr Gerät so konfiguriert haben, dass die Installation der App aus unbekannten Quellen möglich ist. Amazon verfügt über eine gute Dokumentation dazu, da Sie diese auch festlegen müssen, um den Amazon Appstore zu installieren. Corona bietet auch eine Anleitung zum Signieren, Erstellen und Testen Ihrer App auf Android-Geräten.

Nachdem das Spiel erfolgreich auf Ihrem Gerät installiert wurde, müssen Sie es als Nächstes verbessern. Fügen Sie beispielsweise einen Pop- oder Knallton hinzu, wenn Sie auf einen Ballon oder eine Bombe tippen. Corona hat eine API dafür:media.playEventSound ().

Oder warum nicht versuchen, eine dritte Art von Objekt hinzuzufügen, sagen wir einen Super-Boost, der die aktuelle Punktzahl verdoppelt, oder wie wäre es mit Hintergrundmusik?

Einpacken

Das Schreiben von Spielen mit Corona ist recht unkompliziert, da das SDK OpenGL unterstützt und eine integrierte 2D-Physik-Engine enthält. Außerdem ist Lua leicht zu erlernen und sollte für niemanden mit einem Minimum an Programmiererfahrung schwierig sein. Auf der Coronalabs-Website finden Sie zahlreiche Dokumentationen, einschließlich vieler Anleitungen und Tutorials.

In weniger als 100 Codezeilen haben wir ein funktionierendes Spiel. OK, es wird keine Preise gewinnen, aber es zeigt die Leistungsfähigkeit und Flexibilität des Corona SDK.

Aktualiieren: Google hat offiziell Google tadia, einen piel-treaming-Dient, angekündigt. Wir haben alle Detail hier!Heute wird e eine Keynote zu Google GDC 2019 geben, in der der uchriee wahrchei...

Google gab heute bekannt, da eine AMP-Technologie (Accelerated Mobile Page) jetzt für Google Mail und für da Internet verfügbar it. Die Funktion wurde über ein Jahr lang getetet....

Interessante Publikationen.