ActionScript-Spiele mit dem Corona SDK auf iOS portieren Teil 1

In diesem Tutorial wird gezeigt, wie Sie ein Flash / Flex-Spiel auf das Corona SDK portieren. Konkret werden wir von ActionScript auf Lua portieren, mit dem Endziel, bisher nur Flash-Spiele auf dem iPhone zu spielen. Neben den Unterschieden in Bezug auf Sprache und API werden in dieser Lernprogrammreihe auch Hardwareeinschränkungen wie Bildschirmgröße und das Fehlen physischer Tasten auf dem iPhone berücksichtigt.

Was ist Corona??

Bevor wir uns mit der eigentlichen Codierung beschäftigen, möchte ich einen schnellen Überblick über die Software geben, die wir erhalten werden
verwenden. Corona SDK ist ein Produkt von Ansca Mobile zur Erstellung von Spielen für iPhone, iPod Touch, iPad und Android-Geräte. Zum Zeitpunkt dieses Schreibens ist hier eine kostenlose, unbegrenzte Testversion des Kits verfügbar. Sie umfasst alle Funktionen der kostenpflichtigen Version, mit Ausnahme der Veröffentlichung in den jeweiligen App-Stores der iPhone- und Android-Geräte. Dieses Tutorial bietet eine gute Einführung in die Leistungsfähigkeit und Effizienz von Corona.

Das Spiel

In diesem Tutorial portieren wir ein Flixel-Spiel von Andreas Zecher. Dieses Spiel wurde mit Andreas 'Tutorial über die Open-Source-Flixel-Bibliothek und die ActionScript-Sprache erstellt. Der Originalcode ist hier verfügbar (Andreas war so freundlich, ihn als Open Source zu veröffentlichen). Wenn Sie daran interessiert sind, Flash-Spiele zu erstellen, lesen Sie unbedingt das ursprüngliche Tutorial. Dort gibt es wirklich hilfreiche Informationen!

Lua-Sprache

Das Software Development Kit von Ansca Mobile verwendet die Programmiersprache Lua und erweitert die API. Lua ist eine sehr saubere Sprache. Während ich auf Anfänger ausgerichtet bin, habe ich festgestellt, dass es mit wenig Code sehr mächtig ist. Lua ist keine
objektorientierte Sprache, es kann jedoch auch ein wenig verfeinert werden, um dem objektorientierten Modell zu folgen.

Werfen wir einen Blick auf unsere erste Hürde: Lua unterscheidet sich syntaktisch von ActionScript.

Variablen in Lua werden anders behandelt als in ActionScript. In ActionScript werden Variablen statisch typisiert. Das heißt, sie geben ihren Typ an und speichern nur Werte dieses Typs, wenn sie nicht explizit konvertiert werden.

? private var_ship: Schiff; // Variablen geben ihren Typ an. Diese Variable ist vom Typ "Ship" private var _aliens: FlxGroup; private var _bullets: FlxGroup; private var _scoreText: FlxText; private var _gameOverText: FlxText; private var _spawnTimer: Number; private var _spawnInterval: Number = 2.5;? 

In lua werden Variablen dynamisch typisiert. Eine Lua-Variable kann jederzeit einen beliebigen Typ enthalten. Ein weiterer
Zu beachten ist, dass Variablen in Lua entweder lokal oder global sind. Eine Variable ist lokal
(nur zugänglich) auf seine .lua-Datei oder deren Funktion usw., wenn der lokalen Datei "local" vorangestellt ist
Variablendeklaration. Ansonsten wird es als "global" betrachtet. Die beste Methode in Lua ist immer zu verwenden
lokale Variablen. Dieses Tutorial wird sich an diese Praxis halten.

? local _ship - Variablen geben ihren Typ nicht an. Diese Variable kann ein "Schiff" oder eine Zeichenfolge sein. Später kann es zum Speichern einer Ganzzahl oder eines Arrays verwendet werden. local _aliens local _bullets local _scoreText local _gameOverText local _spawnTimer = nil - Diese Variable hat eine Zuweisung und eine Deklaration in derselben Zeile. local _spawnInterval = 2.5 - Dies auch? 

Wie Sie wahrscheinlich bereits bemerkt haben, werden Kommentare in Lua anders behandelt als in ActionScript.

 // Dies ist ein Kommentar in ActionScript / * Dies ist ein mehrzeiliger Kommentar in ActionScript * /
 -- Dies ist ein Kommentar in lua - [[Dies ist ein mehrzeiliger Kommentar in lua -]].

Zu den Kommentaren in Lua ist es wichtig zu wissen, dass alles nach "-" ein Kommentar ist
zum "--[[". Dies ermöglicht einen ordentlichen Trick. Wenn Sie am Anfang der Multilinie einen zusätzlichen Gedankenstrich hinzufügen
Kommentar "--- [[", kommentiert den mehrzeiligen Teil aus. Das passiert da alles nach dem ersten
zwei Striche sind ein Kommentar. Schau dir jetzt den Endkommentar "-]]" an. Es ist schon ein Kommentar, weil es auch so ist
ist nach zwei Strichen. Dies wird effektiv zu einem Schalter zum Ein- und Ausschalten von Codebits!

 --[[Dies ist ein Kommentar -]] --- [[Dies ist ein Code und wird als solcher ausgeführt. In diesem Fall wird ein Fehler ausgegeben. -]]

Schleifen, Klammern und Operatoren werden durch Wörter in Lua definiert:

 // ActionScript if (_spawnTimer < 0)  spawnAlien(); resetSpawnTimer(); 
 -- lua if (_spawnTimer < 0) then spawnAlien() resetSpawnTimer() end

Lua verwendet "wenn-dann", "else", "elseif-then", "end", "und", "oder" usw. Beachten Sie auch, dass Lua dies nicht verwendet
Semikolons, um jede Zeile zu beenden. Ohne alle Klammern und Semikola sieht Lua-Code viel mehr aus
wie englische Sprache als andere Programmiersprachen.

Zu beachten ist, dass Lua keine Unterstützung für Zuweisungsverknüpfungen bietet.

 // ActionScript _spawnInterval * = 0,95; // Dies ist in ActionScript zulässig
 -- lua _spawnInterval * = 0.95 - Dies führt zu einem Fehler in lua _spawnInterval = _spawnInterval * 0.95 - Dies ist der richtige Lua-Code

Beginn der Portierung

Nun, da wir einige der grundlegenden Unterschiede zwischen ActionScript und Lua verstehen, können wir mit dem
Übertragung des Spiels zwischen ihnen. Der Quellcode für dieses Tutorial und dieser Beitrag enthält das
ursprünglicher Quellcode und der fertige Code für das heutige Projekt.

Syntax

Um das Portieren im weiteren Verlauf zu vereinfachen, konvertieren wir zunächst die gesamte Syntax in unserer Quelle
Dateien, ohne sich mit der tatsächlichen Anwendungslogik zu beschäftigen. Auf diese Weise, wenn wir anfangen, an der Logik zu arbeiten, die
Code wird bereits richtig formatiert. Beginnen wir den Prozess mit der Datei Main.as, die aussieht
etwas wie das:

 Paket import org.flixel. *; import de.pixelate.flixelprimer. *; [SWF (width = "640" ,, backgroundColor = "# ABCC7D")] [Frame (factoryClass = "Preloader")] public Klasse Main erweitert FlxGame öffentliche Funktion Main (): void super (640, 480, PlayState, 1); 

Hier gibt es nicht viel zu tun. Wir brauchen keine "package" -Deklaration, daher können wir die obere und die untere Zeile des Codes entfernen.

 import org.flixel. *; import de.pixelate.flixelprimer. *; [SWF (width = "640" ,, backgroundColor = "# ABCC7D")] [Frame (factoryClass = "Preloader")] public Klasse Main erweitert FlxGame öffentliche Funktion Main (): void super (640, 480, PlayState, 1); 

Da Lua keine Klassen hat, können wir die Zeile "Öffentliche Klasse Main erweitert FlxGame" entfernen und das ist es
entsprechende Klammern.

 import org.flixel. *; import de.pixelate.flixelprimer. *; [SWF (width = "640" ,, backgroundColor = "# ABCC7D")] [Frame (factoryClass = "Preloader")] öffentliche Funktion Main (): void super (640, 480, PlayState, 1); 

Jetzt können wir an der Main () - Funktion arbeiten. Beachten Sie zunächst die "öffentliche" Erklärung der Methode.
Lua hat keine separaten Funktionstypen, daher können wir diese entfernen. Denken Sie daran, dass in Lua Funktionen funktionieren
Geben Sie nicht ihren Rückgabetyp an. Am Ende der Funktionsdeklaration steht ein Schlüsselwort ": void".
Dies bedeutet, dass diese Funktion keinen Wert zurückgibt, der in Lua nicht erforderlich ist. Also können wir fallen lassen
es. Sie können es später einfach als Referenz auskommentieren. Entfernen Sie zum Schluss die Klammern
Main(). In lua verwenden wir Wörter. Fügen Sie am Ende der Funktion "Ende" hinzu.

 import org.flixel. *; import de.pixelate.flixelprimer. *; [SWF (width = "640" ,, backgroundColor = "# ABCC7D")] [Frame (factoryClass = "Preloader")] Funktion Main () -: void super (640, 480, PlayState, 1); Ende

Entfernen Sie zum Abschluss alle Semikolons ";" und kommentieren Sie alle Codezeilen aus. Diese
So können wir mit der Portierungslogik beginnen, ohne Fehler zu erhalten.

 --import org.flixel. * --import de.pixelate.flixelprimer. * - [SWF (width = "640" ,, backgroundColor = "# ABCC7D")] - [Frame (factoryClass = "Preloader")] - Funktion Main () -: void - super (640, 480, PlayState, 1) - End

An dieser Stelle möchten Sie einen Projektordner für Ihre Dateien erstellen. Ich habe meine angerufen
"alien_shooter". Dies ist der Ordner, den Sie an Corona übergeben werden, wenn Sie bereit sind, Ihre Datei auszuführen
Code. Im Ordner sucht Corona nach der Datei "main.lua". Corona unterscheidet zwischen Groß- und Kleinschreibung, also Sie
darf den ersten Buchstaben nicht wie in "Main.as" groß schreiben. Speichern Sie den obigen Code als main.lua.

Fahren wir mit der nächsten Datei fort. Heute arbeiten wir nur mit zwei der Quelldateien. Der Zweite
Die Datei befindet sich im angehängten Quellcode unter "de / pixelate / flixelprimer / PlayState.as". Diese Datei ist wo
Das gesamte Gameplay wird behandelt. Es ist also die längste Datei. Wir werden die Syntax in kleinen Abschnitten ändern.
Genau wie die Hauptdatei enthält dieser Code eine Paket- und Klassendeklaration. Entfernen Sie die Zeilen, die beginnen
mit "package" und "public class PlayState" und ihren Klammern.

Wir sehen jetzt eine Liste der lokalen Variablen.

? private var_ship: Schiff; private var _aliens: FlxGroup; private var _bullets: FlxGroup; private var _scoreText: FlxText; private var _gameOverText: FlxText; private var _spawnTimer: Number; private var _spawnInterval: Number = 2.5;? 

Denken Sie daran, dass Variablen in Lua entweder lokal oder global sind und dies nicht brauchen
erkläre ihren Typ. Ändern Sie die Variablen wie folgt:

? lokales _schiff; lokale _aliens; lokale _bullets; lokaler _scoreText; local _spawnInterval = 2,5;? 

Verschieben Sie nun die Liste der Funktionsdeklarationen nach unten, beginnend mit create (). Entfernen Sie alle Funktionstypdeklarationen, z. B. "public".
oder "public überschreiben". Kommentieren oder entfernen Sie alle Rückgabetypen für die Funktionen. Fast alle diese Funktionen sind ": void". Ersetzen Sie die Klammern der Funktion durch "Ende". Create () sollte jetzt so aussehen:

? Funktion create () -: void FlxG.score = 0; bgColor = 0xFFABCC7D; _ship = neues Schiff (); add (_ship); _aliens = new FlxGroup (); add (_aliens); _bullets = new FlxGroup (); add (_bullets); _scoreText = neuer FlxText (10, 8, 200, "0"); _scoreText.setFormat (null, 32, 0xFF597137, "left"); add (_scoreText); resetSpawnTimer (); super.create (); Ende? 

Wenn wir zu Funktionen wie update () gelangen, müssen wir uns auch mit if-then-Anweisungen befassen. Gerade
Ersetzen Sie die öffnende Klammer "" durch "dann" und die schließende Klammer "" durch "Ende". Jedes "&&" sollte
durch "und" ersetzt werden. "||" sollte durch "oder" ersetzt werden.

? function update () -: void FlxU.overlap (_aliens, _bullets, overlapAlienBullet); FlxU.overlap (_aliens, _ship, overlapAlienShip); if (FlxG.keys.justPressed ("SPACE") und _ship.dead == false), dann spawnBullet (_ship.getBulletSpawnPosition ()); end wenn (FlxG.keys.ENTER und _ship.dead), dann FlxG.state = new PlayState (); end _spawnTimer - = FlxG.elapsed; if (_spawnTimer < 0) then spawnAlien(); resetSpawnTimer(); end super.update(); end? 

Einige Funktionen, wie z. B. overlapAlienBullet (), benötigen Argumente. In ActionScript müssen wir die Art der Argumente angeben, die wir übergeben werden. Die Funktion overlapAlienBullet () benötigt eine Variable "alien" (vom Typ Alien) und eine Variable mit dem Namen "bullet" (vom Typ Bullet). Diese Typdeklarationen sollten entfernt werden. ÜberlappungsAlienBullet () hat auch lokale Variablen. Entfernen Sie auch die Typdeklarationen aus diesen. Hinweis: Für lokale Variablendeklarationen muss das Schlüsselwort local vorhanden sein.

Vor:

? private Funktion overlapAlienBullet (Alien: Alien, Bullet: Bullet): void var-Emitter: FlxEmitter = createEmitter (); emitter.at (alien); alien.kill (); bullet.kill (); FlxG.play (SoundExplosionAlien); FlxG.score + = 1; _scoreText.text = FlxG.score.toString (); ? 

Nach dem:

? function overlapAlienBullet (alien, bullet) -: void local emitter = createEmitter (); emitter.at (alien); alien.kill (); bullet.kill (); FlxG.play (SoundExplosionAlien); FlxG.score + = 1; _scoreText.text = FlxG.score.toString (); Ende? 

Die letzte Funktion, createEmitter (), hat eine for-do-Anweisung. Wir werden diese Funktion nicht verwenden
im abschließenden Spiel, aber wir sollten diese Aussage betrachten:

 für (var i: int = 0; i < particles; i++)  var particle:FlxSprite = new FlxSprite(); particle.createGraphic(2, 2, 0xFF597137); particle.exists = false; emitter.add(particle); 

Die oberste Codezeile erstellt eine Variable "i" mit dem Wert 0. Der Code in den Klammern wiederholt sich dann
selbst, während "i" kleiner ist als die Variable "Partikel". Jede Schleife erhält die Variable "i"
um 1 erhöht.

 für i = 0 tun Partikel-1? Ende

Die obige Lua-Anweisung erstellt eine Variable "i" mit dem Wert 0. Der Code in den Klammern
wiederholt sich selbst, bis "i" gleich der Variablen "Partikel" minus 1 ist (wie bei der Prüfung von "i"
ist weniger als "Teilchen"). Die Variable "i" wird in jeder Schleife um 1 erhöht.

Wir können jetzt nur noch die Syntax behandeln. Entfernen Sie alle Semikolons. Kommentieren Sie den gesamten Code aus
mit der Hauptdatei. Fügen Sie einzeilige Kommentare vor den einzelnen Codezeilen ein.

 --local _ship --local _aliens --local _bullets --local _scoreText --local _spawnInterval = 2.5

Fügen Sie mehrzeilige Kommentare zu Funktionen und Codeabschnitten hinzu.

 --[[function create () -: void FlxG.score = 0 bgColor = 0xFFABCC7D _ship = new Ship () add (_ship) _aliens = new FlxGroup () add (_aliens) _bullets = new FlxGroup () add (_bullets) _scoreText = new FlxText (10, 8, 200, "0") _scoreText.setFormat (null, 32, 0xFF597137, "left") add (_scoreText) resetSpawnTimer () super.create () end -]]

Speichern Sie diese Datei als PlayState.lua in Ihrem Projektordner. Legen Sie es nicht in ein Unterverzeichnis
wie der Quellcode. Corona hat Probleme mit Modulen in Unterverzeichnissen.

Module und erforderlich

Nun können wir die Logik hinter diesem Spiel portieren. Sprechen wir zuerst über die Dateilogik.
In unserer ActionScript-Quelle wird zuerst die Datei Main.as ausgeführt. Die anderen Dateien, wie z
PlayState.as werden Pakete genannt. Diese Pakete werden in die Hauptdatei importiert. In Lua die
Die main.lua-Datei wird zuerst ausgeführt. Die anderen Dateien werden als Module bezeichnet und werden in der benötigt
Hauptdatei. In ActionScript haben Pakete eine Paketdeklaration. In Lua müssen Module auch über ein
Deklaration, oder die Hauptdatei kann sie nicht sehen. Dies bedeutet, dass wir unsere PlayState.lua-Datei ändern müssen.
Fügen Sie am Anfang der Datei oder einer anderen Moduldatei diese Zeile hinzu, damit main.lua mit der Datei arbeiten kann
Modul.

 Modul (?, package.seeall)

Gehen Sie jetzt zurück zur Datei main.lua, damit wir unser Modul laden können. Es sollte so aussehen:

 --import org.flixel. * --import de.pixelate.flixelprimer. * - [SWF (width = "640" ,, backgroundColor = "# ABCC7D")] - [Frame (factoryClass = "Preloader")] - Funktion Main () -: void - super (640, 480, PlayState, 1) - End

Wir sehen, dass der ursprüngliche ActionScript-Code alle Pakete in "org / flixel" und in importiert hat
"de / pixelate / flixelprimer". Ersetzen Sie diese Zeilen, um dies zu machen:

 local PlayState = required ("PlayState") - [SWF (width = "640" ,, backgroundColor = "# ABCC7D")] - [Frame (factoryClass = "Preloader")] - function Main () -: void - super (640, 480, PlayState, 1) - beenden

Dieser Code erstellt eine neue Variable (die sich lokal in der Hauptdatei befindet), um das erforderliche Modul aufzunehmen. Wir
kann jetzt auf jeden Code aus der Datei PlayState.lua aus der Variablen "PlayState" zugreifen.

OOP in Lua

Bevor wir mit main.lua fortfahren, müssen wir einige Änderungen an PlayState.lua vornehmen. Wenn wir uns das anschauen
In der ursprünglichen PlayState.as-Datei sehen wir, dass die gesamte Funktionalität in eine Klasse eingeschlossen ist
genannt PlayState. Wir können keine Klassen mit Lua erstellen, aber wir können unseren Code so gestalten, dass er erstellt wird
es objektorientiert. Durch das Umschließen aller Funktionen mit einer Konstruktorfunktion können wir dies erreichen
der gleiche Effekt. Fügen Sie den gesamten Code auskommentiert hinzu und fügen Sie diese Zeilen um den gesamten Code ein.

 Funktion PlayState ()? Code geht hier? Ende

Nun sind alle Funktionen lokal für die Funktion PlayState. Diese Funktionen werden privat
eine Art PlayState-Instanz, die erstellt wird, wenn PlayState () aufgerufen wird. Wenn Sie einen nachahmen wollten
Klassenmethode können Sie die Deklaration außerhalb der Funktion platzieren. Wir werden in späteren Lektionen lernen
So erstellen Sie auch hier Instanzmethoden.

Hier ist ein Beispielmodul, das diese Funktionalität demonstriert:

 module (?, package.seeall) local numberOfInstances = 0 - diese Funktion ahmt eine Klassenmethodenfunktion getNumberOfInstances () zurück numberOfInstances end - Diese Funktion ahmt eine Klassenfunktion Instance () local Instance =  numberOfInstances = numberOfInstances + 1 local instanceNumber = numberOfInstances - Diese Funktion ahmt eine Instanzmethodenfunktion nach. Instance: getInstanceNumber () return instanceNumber end - Diese Funktion ahmt eine private Methode an. create () return Instanzende - ruft die private Methode auf, nachdem alle Funktionen für return deklariert wurden create () ende

Wenn Sie mit dem obigen Code spielen möchten, finden Sie hier eine main.lua-Datei, die die Verwendung demonstriert (vorausgesetzt, die
Modul wird als test.lua gespeichert:

 local test = required ("test") local Instanz1 = test.Instance () local Instanz2 = test.Instance () local Instanz3 = test.Instance () local Instanz4 = test.Instance () print (test.getNumberOfInstances ()) print (instance2: getInstanceNumber ())

Beachten Sie, dass die Funktionen des Moduls Punktsyntax verwenden, während alle anderen Lua-Funktionen (und sogar einige davon)
ihre Deklarationen wie wir gerade gesehen haben) verwenden einen Doppelpunkt (:) anstelle des Punktes. Das kann verwirrend sein, da
Auf Eigenschaften in Lua wird mit Punktsyntax zugegriffen. Aus diesem Grund haben wir alle Funktionsaufrufe verlassen
alleine beim Portieren der Syntax zuvor. Wir entscheiden, ob Sie für jeden Fall einen Doppelpunkt oder einen Punkt verwenden
wir stoßen auf.

Da wir nun alle Funktionen in PlayState.lua in der Funktion PlayState () haben, ist alles vorhanden
Die Funktionen ahmen jetzt private Funktionen in ActionScript nach. Welches genau ist
Was wir wollen. Fügen Sie eine lokale PlayState-Variable am oberen Rand der Funktion hinzu.

 Funktion PlayState () local PlayState = ? Ende

Beginnen Sie nun und kommentieren Sie die create () - Funktion und verschieben Sie sie nach unten (kurz davor)
das letzte Ende). Fügen Sie allen Zeilen innerhalb der Funktion einzeilige Kommentare hinzu
Sehen Sie sich die Logik an, wirft aber keine Fehler.

 module (?, package.seeall) Funktion PlayState () local PlayState = ? eine ganze Reihe von kommentiertem Code? Funktion create () -: void --FlxG.score = 0 --bgColor = 0xFFABCC7D --_ ship = new Schiff () - add (_ship) --_ aliens = neue FlxGroup () --add (_aliens) - _bullets = new FlxGroup () --add (_bullets) --_ scoreText = neuer FlxText (10, 8, 200, "0") --_ scoreText.setFormat (null, 32, 0xFF597137, "left") --add (_scoreText) ) --resetSpawnTimer () --super.create () Ende

Zu Coronas API wechseln

Das ursprüngliche ActionScript-Spiel wurde mit der zu Beginn besprochenen Flixel-Bibliothek erstellt
Lektion. Zum jetzigen Zeitpunkt gibt es leider keinen Lua-Port für Flixel. Also werden wir sein
Implementierung der gesamten Flixel-Logik mit der API von Corona SDK.

Das erste, was Sie beachten sollten, ist wieder in der Datei main.lua. In flixel funktioniert die Main () automatisch
wird aufgerufen, wenn das Programm ausgeführt wird. In Corona wird die Datei main.lua von oben nach unten ausgeführt.
Um den gleichen Effekt wie in der Quelle zu erzielen, fügen Sie Main () am Ende von main.lua hinzu.

 local PlayState = required ("PlayState") - [SWF (width = "640" ,, backgroundColor = "# ABCC7D")] - [Frame (factoryClass = "Preloader")] - Funktion Main () -: void - - Super (640, 480, PlayState, 1) Ende Main ()

In den meisten Flixel-Spielen wird außerdem ein Preloader mit dem Flixel-Logo angezeigt, während das Programm läuft
Wird geladen. Wir brauchen das nicht für unsere App, daher erstellen wir keine preloader.lua-Datei. Die Zeilen werden hinzugefügt
Der Preloader und die Einstellung der Programmgröße / des Hintergrunds können entfernt werden (die App kann nicht geändert werden
Größe).

 local PlayState = Required ("PlayState") - Funktion Main () -: void - super (640, 480, PlayState, 1) Ende Main ()

Erstellen Sie in Main () einen neuen PlayState, während wir hier sind..

 local PlayState = required ("PlayState") - Funktion Main () -: void PlayState.PlayState () Ende Main ()

Bei der Rückkehr zu PlayState.lua stellen wir fest, dass create () nicht aufgerufen wird. In Flixel erstellen Sie () und
update () wird automatisch behandelt. Wir werden uns in Corona darum kümmern müssen. Füge hinzu ein
Aufruf zum Erstellen () vor dem letzten Ende.

 module (?, package.seeall) Funktion PlayState () local PlayState = ? eine ganze Reihe von kommentiertem Code? Funktion create () -: nichtig? kommentierte create () - Logik? Ende create () Ende

Bevor wir fortfahren, werfen wir einen Blick auf das, was wir bisher haben. Wir haben jetzt eine main.lua-Datei
erfordert PlayState.lua und führt PlayState () aus. PlayState () erstellt eine neue PlayState-Instanz und dann
ruft create () auf. Create () ist der Ort, an dem der gesamte Setup-Code für das Spiel gespeichert wird. Wir haben jetzt einen Rahmen
um unsere Logik herum aufzubauen.

Objekte anzeigen

Jetzt müssen wir der create () - Funktion weitere Features hinzufügen, um unser Spiel einzurichten. Beginnen wir mit
Erstellen des grünen Hintergrunds des Spiels. In unserem Code haben wir diese Zeile in unserem kommentiert
create () - Funktion.

 --bgColor = 0xFFABCC7D;

Dies gibt uns den Hexadezimalwert für die ursprüngliche grüne Farbe an. Eine einfache Möglichkeit, einen Hintergrund zu erstellen
In Corona wird ein farbiges Rechteck erstellt, das die gleiche Größe wie der Bildschirm hat. Dies kann mit geschehen
Corona-Anzeigeobjekte. Ähnlich wie ActionScript bietet Corona eine API zum Anzeigen von Objekten für
der Bildschirm. Wir können das Anzeigemodul für viele verschiedene Aufgaben verwenden. Es kann zum Erstellen verwendet werden
neue Objekte oder Objektgruppen oder zum Ermitteln der Breite / Höhe des Bildschirms. Lass uns ein neues erstellen
Rechteck und speichern Sie es als Eigenschaft unserer PlayState-Variablen.

 module (?, package.seeall) Funktion PlayState () local PlayState = ? eine ganze Reihe von kommentiertem Code? Funktion create () -: void PlayState._background = display.newRect (0, 0, display.contentWidth, display.contentHeight)? kommentierte create () - Logik? Ende create () Ende

Hier haben wir ein neues Rechteck von (0,0) bis (Breite des Bildschirms, Höhe des Bildschirms) erstellt und gespeichert
es in der Variable _background. Ich setze den Unterstrich dort ein, um den ursprünglichen Code nachzubilden. Alles
der privaten Variablen in der ActionScript-Version des Spiels beginnen mit einem Unterstrich.
_background ist für jede PlayState-Instanz privat, also habe ich es wie die anderen Variablen formatiert.

Beachten Sie die Punktsyntax. Wenn Sie sich von früher erinnern, bedeutet dies, dass _background jetzt eine Eigenschaft von ist
PlayState. Da wir die Variable PlayState außerhalb der create () - Funktion erstellt haben, ist sie verfügbar
Nun zu allen Funktionen. Wenn wir PlayState in create () folgendermaßen erstellt hätten:

 module (?, package.seeall) -Funktion PlayState () - Funktion create () - PlayState ist jetzt lokal zum Erstellen () local PlayState =  - PlayState kann weiterhin in create verwendet werden, ist jedoch außerhalb nicht verfügbar. PlayState._aNumber = 10 end function otherFunction () - Dies gibt einen Fehler aus. otherFunction weiß nicht, was PlayState ist. print (PlayState._aNumber) end create () otherFunction () end

Wir hätten es nicht in otherFunction () verwenden können. Da wir am Anfang PlayState erstellt haben
von PlayState () können alle Funktionen verwendet werden.

 Modul (?, package.seeall) -Funktion PlayState () - PlayState ist jetzt lokal für PlayState (). Lokale PlayState =  -Funktion create () - PlayState (und seine Eigenschaften) können beim Erstellen und an anderen Stellen verwendet werden. PlayState._aNumber = 10 End-Funktion otherFunction () PlayState._aNumber = PlayState._aNumber + 4 - Dies druckt 14 print (PlayState._aNumber) end create () otherFunction () end

Wenn Sie den Code mit dem neuen Rechteck ausführen, wird ein weißer Hintergrund angezeigt. Wir müssen es ändern
Füllfarbe auf grün. Dazu müssen wir den Hex-Code (ABCC7D) in RGB umwandeln
Corona verwendet, um Anzeigeobjekte zu füllen. Sie können diesen Code in jede der Hex-Websites in RGB einfügen.
Das Ergebnis ist (171, 204, 125). Verwenden Sie nun die Instanzmethode setFillColor (beachten Sie den Doppelpunkt)
PlayState._background.

 module (?, package.seeall) Funktion PlayState () local PlayState = ? eine ganze Reihe von kommentiertem Code? Funktion create () -: void PlayState._background = display.newRect (0, 0, display.contentWidth, display.contentHeight) PlayState._background: setFillColor (171, 204, 125)? kommentierte create () - Logik? Ende create () Ende

Jetzt haben wir den Anfang eines Spiels. Lassen Sie uns noch ein paar Änderungen vornehmen, bevor wir den Tag beenden.
Fügen wir zu jeder Instanz von PlayState eine Variable hinzu, um festzustellen, ob das Spiel läuft oder nicht.

 module (?, package.seeall) Funktion PlayState () local PlayState = ? eine ganze Reihe von kommentiertem Code? Funktion create () -: void PlayState._inGame = true PlayState._background = display.newRect (0, 0, display.contentWidth, display.contentHeight) PlayState._background: setFillColor (171, 204, 125)? kommentierte create () - Logik? Ende create () Ende

Das wird später sehr nützlich. Lassen Sie uns auch die Statusleiste oben auf dem iPhone loswerden.
Wir möchten, dass dies nur einmal beim Start der App gemacht wird. Fügen Sie dies also main.lua hinzu.

 local PlayState = required ("PlayState") - Funktion Main () -: void display.setStatusBar (display.HiddenStatusBar) PlayState.PlayState () Ende Main ()

Ein weiterer wichtiger Schritt bei der Erstellung einer Corona-App ist das Hinzufügen einer Konfigurationsdatei, die Corona mitteilt, wie es geht
um Ihre App auf anderen Plattformen zu skalieren. In diesem Tutorial befassen wir uns nur mit den iPhone's
Bildschirmgröße (obwohl die App auch auf Android laufen kann). Erstellen Sie eine Datei namens config.lua und füllen Sie sie aus
mit diesem.

 application = content = width = 320, height = 480, scale = "letterbox",

Jetzt läuft unsere App auch auf Retina-Displays. Hinweis: Diese Datei funktioniert mit jeder Corona-App.

Fazit

Wir haben jetzt einen Arbeitsrahmen, auf dem wir aufbauen können. Unsere App sieht noch nicht viel aus, aber wir
haben viele wichtige Schritte beim Portieren von einer Sprache in eine andere abgedeckt. Im nächsten
Lektion in dieser Serie werden wir ein spielbares Spiel machen.