Portie van ActionScript-spellen naar iOS met de Corona SDK deel 1

In deze zelfstudie wordt gekeken naar het overbrengen van een Flash / Flex-spel naar de Corona SDK. Specifiek zullen we porten van ActionScript naar Lua, met als einddoel het spelen van voorheen Flash-only games op de iPhone. Naast het aantonen van taal- en API-verschillen, houdt deze tutorialreeks ook rekening met hardwarebeperkingen zoals schermgrootte en gebrek aan fysieke knoppen op de iPhone.

Wat is Corona?

Voordat we ingaan op de eigenlijke codering, wil ik graag een kort overzicht geven van de software die we zullen gebruiken
gebruiken. Corona SDK is een product van Ansca Mobile voor het maken van games voor iPhone-, iPod Touch-, iPad- en Android-apparaten. Op het moment van schrijven is hier een gratis proefversie van de gratis proefversie beschikbaar. Het bevat alle functionaliteit van de betaalde versie, behalve het publiceren naar respectieve app-stores van de iPhone en Android-apparaten. Deze tutorial vormt een geweldige introductie tot de kracht en efficiëntie van Corona.

Het spel

In deze tutorial porteren we een spel met flixel-aandrijving van Andreas Zecher. Deze game is gemaakt met de tutorial van Andreas over de open-source flixel-bibliotheek en de ActionScript-taal. De originele code is hier beschikbaar (Andreas was zo vriendelijk om het als open source vrij te geven). Als je geïnteresseerd bent in het maken van flashgames, bekijk dan zeker de originele tutorial. Er is een aantal erg nuttige informatie daar!

Lua Language

De software-ontwikkelingskit van Ansca Mobile maakt gebruik van de lua-programmeertaal en breidt hun API uit. Lua is een zeer nette taal. Terwijl ik voor beginners ben, heb ik ontdekt dat het erg krachtig is met heel weinig code. Lua is geen
object-georiënteerde taal, maar het kan worden gemaakt om het object-georiënteerde model te volgen met enige verfijning.

Laten we daarom eens kijken naar onze eerste hindernis: Lua is syntactisch anders dan ActionScript.

Variabelen in Lua worden anders behandeld dan in ActionScript. In ActionScript zijn variabelen statisch getypt. Dit betekent dat ze hun type en alleen winkelwaarden van dat type declareren, tenzij ze expliciet worden geconverteerd.

? privé var _ship: schip; // Variabelen verklaren hun type. Deze variabele is van het type "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 worden variabelen dynamisch getypt. Een Lua-variabele kan elk type op elk moment bevatten. Een ander
ding om op te merken is dat variabelen in Lua lokaal of globaal zijn. Een variabele is lokaal
(alleen toegankelijk) voor zijn .lua-bestand of zijn functie, enz. als het wordt voorafgegaan door "local" in de
variabele verklaring. Anders wordt het als "globaal" beschouwd. De beste methode in Lua is om altijd te gebruiken
lokale variabelen. Deze tutorial houdt zich aan die praktijk.

? local_ship - Variabelen verklaren hun type niet. Deze variabele kan een "Schip" zijn of een tekenreeks. Later zou het kunnen worden gebruikt om een ​​integer of een array op te slaan. local _aliens local _bullets local _scoreText local _gameOverText local _spawnTimer = nil - Deze variabele heeft een toewijzing en een declaratie op dezelfde regel. local _spawnInterval = 2.5 - Dit is ook het geval? 

Zoals u waarschijnlijk al hebt opgemerkt, worden opmerkingen in Lua anders behandeld dan in ActionScript.

 // Dit is een opmerking in ActionScript / * Dit is een opmerking met meerdere regels in ActionScript * /
 -- Dit is een commentaar in lua - [[Dit is een commentaar met meerdere regels in lua -]]

Een belangrijk ding om te weten over de opmerkingen in Lua is dat alles na "-" een opmerking is, behalve
voor "--[[". Dit zorgt voor een leuke truc. Als u een extra streepje toevoegt aan het begin van de multilijn
comment "--- [[", het becommentarieert het uit meerdere regels bestaande gedeelte. Dit gebeurt omdat alles na de eerste is
twee streepjes is een opmerking. Kijk nu naar het einde commentaar "-]]". Het is al een reactie omdat het ook
is na twee streepjes. Dit wordt in feite een schakelaar om stukjes code uit te schakelen!

 --[[Dit is een opmerking -]] --- [[Dit is code en zal als zodanig worden uitgevoerd. In dit geval zou een fout worden gegenereerd. -]]

Lussen, haakjes en operatoren worden gedefinieerd door woorden in Lua:

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

Lua gebruikt "if-then", "else", "elseif-then", "end", "and", "or", etc. Merk ook op dat Lua niet gebruikt
puntkomma's om elke regel te beëindigen. Zonder alle haakjes en puntkomma's ziet de Lua-code er veel meer uit
zoals Engels, dan andere programmeertalen.

Nog een ding om op te merken voordat we beginnen is dat Lua geen ondersteuning biedt voor snelkoppelingen naar opdrachten.

 // ActionScript _spawnInterval * = 0,95; // Dit is toegestaan ​​in ActionScript
 -- lua _spawnInterval * = 0.95 - Dit zal resulteren in een fout in lua _spawnInterval = _spawnInterval * 0.95 - Dit is de juiste Lua-code

Begin met porten

Nu we enkele van de fundamentele verschillen tussen ActionScript en Lua begrijpen, kunnen we beginnen met
proces van het overbrengen van het spel tussen hen. De broncode voor deze tutorial en bijgevoegd bij deze post omvat de
originele broncode en de voltooide code voor het project van vandaag.

Syntaxis

Om porten op de weg eenvoudiger te maken, beginnen we met het converteren van alle syntaxis in onze bron
bestanden, zonder onszelf bezig te houden met de werkelijke applicatielogica. Op deze manier, wanneer we aan de logica beginnen te werken, de
code is al goed geformatteerd. Laten we het proces beginnen met het Main.as-bestand, dat er uitziet
iets zoals dit:

 pakket import org.flixel. *; import de.pixelate.flixelprimer. *; [SWF (width = "640" ,, backgroundColor = "# ABCC7D")] [Frame (factoryClass = "Preloader")] public class Main breidt FlxGame uit public function Main (): void super (640, 480, PlayState, 1); 

Er is hier niet veel te doen. We hebben de "pakket" -verklaring niet nodig, dus we kunnen de bovenste en onderste regel code verwijderen.

 import org.flixel. *; import de.pixelate.flixelprimer. *; [SWF (width = "640" ,, backgroundColor = "# ABCC7D")] [Frame (factoryClass = "Preloader")] public class Main breidt FlxGame uit public function Main (): void super (640, 480, PlayState, 1); 

Omdat Lua geen klassen heeft, kunnen we de regel verwijderen "public class Main extends FlxGame" en dat is het ook
overeenkomstige haakjes.

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

Nu kunnen we werken aan de Main () -functie. Merk allereerst de "openbare" verklaring van de methode op.
Lua heeft geen afzonderlijke functietypen, dus we kunnen dat verwijderen. Onthoud dat in lua, functies
geef hun type teruggave niet aan. Er is een sleutelwoord ": void" aan het einde van de functieverklaring.
Dit betekent dat deze functie geen waarde teruggeeft, wat niet nodig is in lua. Dus we kunnen vallen
het. Misschien wilt u het later gewoon ter referentie vermelden. Verwijder ten slotte de beugels rond
Hoofd(). In lua gebruiken we woorden. Voeg 'einde' toe aan het einde van de functie.

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

Om de zaken af ​​te ronden, verwijdert u alle puntkomma's ";" en becommentarieer alle regels code. Deze
Zo kunnen we beginnen met het overdragen van logica zonder fouten te krijgen.

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

Op dit punt wilt u een projectmap maken om uw bestanden te bewaren. Ik heb de mijne gebeld
"Alien_shooter". Dit is de map die u doorgeeft aan Corona wanneer u klaar bent om uw campagne uit te voeren
code. Binnen in de map zoekt Corona naar het bestand "main.lua". Corona is hoofdlettergevoelig, dus jij
mag de eerste letter niet kapitaliseren zoals in "Main.as". Sla de bovenstaande code op als main.lua.

Laten we naar het volgende bestand gaan. Vandaag werken we alleen met twee van de bronbestanden. De seconde
bestand bevindt zich op "de / pixelate / flixelprimer / PlayState.as" in de bijgevoegde broncode. Dit bestand is waar
alle gameplay wordt afgehandeld. Als zodanig is dit het langste bestand. We zullen de syntaxis in kleine stukjes wijzigen.
Net als het hoofdbestand heeft deze code een pakket- en klasseverklaring. Verwijder de lijnen die beginnen
met "pakket" en "openbare klasse PlayState" en hun haakjes.

We zien nu een lijst met lokale variabelen.

? privé var _ship: schip; 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;? 

Onthoud eerder dat variabelen in Lua lokaal of globaal zijn en dat ze niet nodig zijn
verklaar hun type. Pas de variabelen aan om er als volgt uit te zien:

? lokaal _ship; lokale _aliens; lokale _bullets; local _scoreText; lokale _spawnInterval = 2,5;? 

Ga nu naar de lijst met functieverklaringen, beginnend met create (). Verwijder alle declaraties van het functietype, zoals "public"
of "negeer publiek". Geef commentaar of verwijder alle retourtypen voor de functies. Bijna al deze functies zijn ": ongeldig". Vervang de haakjes van de functie door "einde". Create () zou er nu als volgt uit moeten zien:

? function create () -: void FlxG.score = 0; bgColor = 0xFFABCC7D; _ship = new Ship (); toe te voegen (_ship); _aliens = nieuwe FlxGroup (); toe te voegen (_aliens); _bullets = nieuwe FlxGroup (); toe te voegen (_bullets); _scoreText = new FlxText (10, 8, 200, "0"); _scoreText.setFormat (null, 32, 0xFF597137, "left"); toe te voegen (_scoreText); resetSpawnTimer (); super.create (); einde? 

Wanneer we bij functies zoals update () aankomen, hebben we ook te maken met if-then-statements. Net
vervang de openingsbeugel "" met "then" en de beugel "" met "end". Elke "&&" zou moeten
worden vervangen door "en". "||" moet worden vervangen door "of".

? functie update () -: void FlxU.overlap (_aliens, _bullets, overlappingAlienBullet); FlxU.overlap (_aliens, _ship, overlappingAlienShip); if (FlxG.keys.justPressed ("SPACE") en _ship.dead == false) en vervolgens spawnBullet (_ship.getBulletSpawnPosition ()); einde als (FlxG.keys.ENTER en _ship.dead) dan FlxG.state = nieuwe PlayState (); einde _spawnTimer - = FlxG.ondersteund; if (_spawnTimer < 0) then spawnAlien(); resetSpawnTimer(); end super.update(); end? 

Sommige functies, zoals overlapAlienBullet (), nemen argumenten. In ActionScript moeten we aangeven welk type argumenten we doorgeven. De functie overlap AlienBullet () neemt een variabele "alien" (van het type Alien) en een variabele genaamd "bullet" (van het type Bullet). Deze typeaangiften moeten worden verwijderd. Overlap AlienBullet () heeft ook lokale variabelen. Verwijder ook de typeaangiften van deze. Opmerking: bij lokale variabele-declaraties moet het trefwoord lokaal zijn.

Voor:

? privéfunctie overlap AlienBullet (alien: Alien, bullet: Bullet): void var emitter: FlxEmitter = createEmitter (); emitter.at (vreemde); alien.kill (); bullet.kill (); FlxG.play (SoundExplosionAlien); FlxG.score + = 1; _scoreText.text = FlxG.score.toString (); ? 

Na:

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

De allerlaatste functie, createEmitter (), heeft een voor-doen-verklaring. We zullen deze functie niet gebruiken
in het laatste spel, maar we moeten deze verklaring eens bekijken:

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

De bovenste regel van de code maakt een variabele "i" met een waarde van 0. De code tussen de haakjes herhaalt zich dan
zelf, terwijl "i" kleiner is dan de variabele "deeltjes". Elke lus, de variabele "i" wordt
verhoogd met 1.

 voor i = 0, deeltjes-1 doen? einde

De bovenstaande Lua-instructie maakt een variabele "i" met een waarde van 0. De code tussen haakjes
herhaalt zichzelf totdat "i" gelijk is aan de variabele "deeltjes" minus 1 (hetzelfde als controleren of "i"
is minder dan "deeltjes"). De variabele "i" wordt ook met 1 elke lus opgehoogd.

We kunnen nu afronden omgaan met alleen syntaxis. Verwijder alle puntkomma's. Geef commentaar op alle code als
met het hoofdbestand. Voeg enkele regelopmerkingen toe vóór individuele regels code.

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

Voeg opmerkingen van meerdere regels toe rond functies en stukjes code.

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

Ga je gang en sla dit bestand op als PlayState.lua in je projectmap. Plaats het niet in een subdirectory
zoals de broncode. Corona heeft problemen met modules in submappen.

Modules en vereisen

Nu zijn we klaar om de logica achter deze game te gaan porten. Laten we eerst de bestandslogica bespreken.
In onze ActionScript-bron wordt het Main.as-bestand als eerste uitgevoerd. De andere bestanden, zoals
PlayState.as, worden pakketten genoemd. Deze pakketten worden geïmporteerd in het hoofdbestand. In Lua, de
main.lua-bestand wordt als eerste uitgevoerd. De andere bestanden staan ​​bekend als modules en zijn verplicht in de
hoofdbestand. In ActionScript hebben pakketten een declaratie van pakketten. In Lua moeten modules ook een
aangifte, of het hoofdbestand kan ze niet zien. Dit betekent dat we ons PlayState.lua-bestand moeten aanpassen.
Voeg aan de bovenkant van het bestand of een ander modulebestand deze regel toe zodat main.lua kan werken met de
module.

 module (?, package.seeall)

Ga nu terug naar het main.lua-bestand zodat we onze module kunnen laden. Het zou er zo uit moeten zien:

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

We zien dat de oorspronkelijke ActionScript-code alle pakketten in 'org / flixel' en in heeft geïmporteerd
"De / pixelate / flixelprimer". Vervang die regels om dit te maken:

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

Deze code maakt een nieuwe variabele aan (die lokaal is voor het hoofdbestand) om de vereiste module te bevatten. Wij
kan nu toegang krijgen tot een willekeurige code uit het bestand PlayState.lua uit de variabele "PlayState".

OOP in Lua

Voordat we verder gaan met main.lua, moeten we enkele wijzigingen aanbrengen in PlayState.lua. Als we naar de
oorspronkelijke PlayState.as-bestand, we zien dat alle functionaliteit in een klasse is ingepakt
PlayStation genoemd. We kunnen geen lessen met lua maken, maar we kunnen onze code zo indelen
het objectgeoriënteerd. Door alle functionaliteit met een constructorfunctie in te pakken, kunnen we dit bereiken
hetzelfde effect. Zorg ervoor dat al uw code is geëtiketteerd en voeg deze regels toe aan alle code.

 functie PlayState ()? code komt hier? einde

Nu zijn alle functies lokaal voor de functie PlayState. Deze functies worden privé voor
een soort PlayState-instantie die wordt gemaakt wanneer PlayState () wordt aangeroepen. Als je een a wilt nabootsen
klassemethode, zou u de verklaring buiten de functie kunnen plaatsen. We zullen in latere lessen leren
hoe u instantiemethodes hier ook kunt maken.

Hier is een voorbeeldmodule die deze functionaliteit demonstreert:

 module (?, package.seeall) local numberOfInstances = 0 - deze functie bootst een class-methodefunctie na getNumberOfInstances () return numberOfInterieurs-einde - deze functie bootst een klassefunctie aan Instance () local Instance =  numberOfInstances = numberOfInstances + 1 local instanceNumber = numberOfInstances - deze functie bootst een instantiemethode aan. Exemplaar: getInstanceNumber () return instanceNumber end - deze functie bootst een privé-methode na de functie create () return Exemplaar-einde - dit roept de private methode aan nadat alle functies zijn geretourneerd create () einde

Als je met de bovenstaande code wilt spelen, is hier een main.lua-bestand dat het gebruik demonstreert (ervan uitgaande dat
module wordt opgeslagen als test.lua):

 local test = require ("test") local instance1 = test.Instance () local instance2 = test.Instance () local instance3 = test.Instance () local instance4 = test.Instance () print (test.getNumberOfInstances ()) afdrukken (INSTANCE2: getInstanceNumber ())

Merk op dat de functies van de module puntsyntaxis gebruiken, terwijl alle andere Lua-functies (en zelfs enkele van
hun verklaringen zoals we net zagen) gebruik een dubbele punt (:) in plaats van de punt. Dit kan verwarrend zijn, zoals
eigenschappen in Lua worden benaderd met de puntsyntaxis. Om deze reden hebben we alle functieaanroepen verlaten
alleen terwijl de syntaxis eerder werd overgedragen. We zullen beslissen of we voor elk geval een dubbele punt of een punt zullen gebruiken
we komen over.

Nu hebben we alle functionaliteit in PlayState.lua in de PlayState () -functie, allemaal
de functies imiteren nu privéfuncties in ActionScript. Dat is precies
wat we willen. Voeg een lokale PlayState-variabele toe aan de bovenkant van de functie.

 function PlayState () local PlayState = ? einde

Ga nu verder en reageer met de create () -functie en verplaats deze naar de bodem (net daarvoor
het laatste uiteinde). Voeg enkele regelopmerkingen toe aan alle regels binnen de functie, zodat we nog steeds kunnen
zie de logica, maar het werpt geen fouten.

 module (?, package.seeall) functie PlayState () local PlayState = ? een hele hoop commentaarcode? 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-end

Verhuizen naar Corona's API

De oorspronkelijke ActionScript-game is gebouwd met behulp van de flixel-bibliotheek die aan het begin van dit hoofdstuk is besproken
les. Helaas is er geen Lua-poort van flixel op dit moment. Dus dat zullen we zijn
implementeren van alle flixel-logica met de API van Corona SDK.

De eerste dingen om op te merken, is terug in het main.lua-bestand. In FIXEL werkt de hoofdfunctie () automatisch
wordt gebeld wanneer het programma wordt uitgevoerd. In Corona wordt het bestand main.lua van boven naar beneden uitgevoerd.
Dus, om hetzelfde effect als in de bron te bereiken, voeg Main () toe aan het einde van main.lua.

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

Ook wordt in de meeste flixel-spellen een preloader met het flixel-logo weergegeven terwijl het programma is
bezig met laden. Dat hebben we niet nodig voor onze app, dus we zullen geen preloader.lua-bestand maken. De regels worden toegevoegd
de preloader en het instellen van de programmagrootte / achtergrond kan worden verwijderd (we kunnen de app niet wijzigen
grootte).

 local PlayState = require ("PlayState") functie Main () -: void - super (640, 480, PlayState, 1) end Main ()

Terwijl we hier zijn, maak een nieuwe PlayState in Main ().

 local PlayState = require ("PlayState") function Main () -: void PlayState.PlayState () end Main ()

Terugkerend naar PlayState.lua, merken we dat create () niet wordt aangeroepen. Maak in flixel () en
update () worden automatisch afgehandeld. We zullen deze zelf in Corona moeten regelen. Voeg een ... toe
aanroep om () vóór het laatste einde aan te maken.

 module (?, package.seeall) functie PlayState () local PlayState = ? een hele hoop commentaarcode? function create () -: void? commentaar gegeven op create () logica? einde create () einde

Laten we, voordat we verder gaan, eens kijken naar wat we tot nu toe hebben gedaan. We hebben nu een main.lua-bestand dat
vereist PlayState.lua en voert PlayState () uit. PlayState () maakt een nieuwe PlayState-instantie en vervolgens
oproepen maken (). Create () is waar alle instellingscode voor het spel naartoe gaat. We hebben nu een kader
om onze logica op te bouwen.

Objecten weergeven

We moeten nu functies toevoegen aan onze create () -functie om onze game in te stellen. Laten we beginnen
het creëren van de groen gekleurde achtergrond van het spel. In onze code hebben we deze regel becommentarieerd in onze
create () functie.

 --bgColor = 0xFFABCC7D;

Dit vertelt ons de hexadecimale waarde voor de originele groene kleur. Een gemakkelijke manier om een ​​achtergrond te maken
in Corona is het maken van een gekleurde rechthoek die dezelfde grootte heeft als het scherm. Dit kan gedaan worden met
Corona's weergave-objecten. Net als ActionScript, geeft Corona ons een API voor het weergeven van objecten
het scherm. We kunnen de displaymodule voor veel verschillende taken gebruiken. Het kan worden gebruikt om te creëren
nieuwe objecten of groepen objecten, of om de breedte / hoogte van het scherm te vinden. Laten we een nieuwe maken
rechthoek en sla het op als een eigenschap van onze PlayState-variabele.

 module (?, package.seeall) functie PlayState () local PlayState = ? een hele hoop commentaarcode? function create () -: void PlayState._background = display.newRect (0, 0, display.contentWidth, display.contentHeight)? commentaar gegeven op create () logica? einde create () einde

Hier hebben we een nieuwe rechthoek gemaakt van (0,0) tot (de breedte van het scherm, de hoogte van het scherm) en opgeslagen
het in de variabele _achtergrond. Ik heb het onderstrepingsteken daar geplaatst om de originele code na te bootsen. Allemaal
van de privévariabelen in de ActionScript-versie van de game begint met een onderstrepingsteken.
_background is privé voor elke PlayState-instantie, dus ik heb het opgemaakt zoals de andere variabelen.

Let op de puntsyntaxis. Als je eerder terugdenkt, betekent dit dat _background nu een eigenschap is van
PlayState. Omdat we de variabele PlayState hebben gemaakt buiten de functie create (), is deze beschikbaar
nu voor alle functies. Als we PlayState in create () als volgt hadden gemaakt:

 module (?, package.seeall) functie PlayState () functie create () - PlayState is nu lokaal te maken () local PlayState =  - PlayState kan nog steeds worden gebruikt in create, maar is niet beschikbaar buiten. PlayState._aNumber = 10 eindfunctie otherFunction () - Dit zal een fout veroorzaken. otherFunction weet niet wat PlayState is. print (PlayState._aNumber) end create () otherFunction () end

We zouden het niet kunnen gebruiken in otherFunction (). Sinds we PlayState aan het begin hebben gemaakt
van PlayState (), kunnen alle functies het gebruiken.

 module (?, package.seeall) functie PlayState () - PlayState is nu lokaal voor PlayState () lokale PlayState =  functie create () - PlayState (en de eigenschappen ervan) kunnen gebruikt worden in create en elders. PlayState._aNumber = 10 eindfunctie otherFunction () PlayState._aNumber = PlayState._aNumber + 4 - Hiermee drukt u 14 print (PlayState._aNumber) end create () otherFunction () einde af

Als u de code uitvoert met de nieuwe rechthoek, ziet u een witte achtergrond. We moeten het veranderen
vul de kleur groen. Om dit te doen, moeten we de hex-code (ABCC7D) naar RGB converteren, en dat is wat
Corona gebruikt om weergaveobjecten te vullen. U kunt die code in elk van de hex-naar-RGB-websites plakken.
Het resultaat is (171, 204, 125). Gebruik nu de setFillColor-exemplaarmethode (let op de dubbele punt)
PlayState._background.

 module (?, package.seeall) functie PlayState () local PlayState = ? een hele hoop commentaarcode? function create () -: void PlayState._background = display.newRect (0, 0, display.contentWidth, display.contentHeight) PlayState._background: setFillColor (171, 204, 125)? commentaar gegeven op create () logica? einde create () einde

Nu hebben we het begin van een spel. Laten we nog enkele wijzigingen aanbrengen voordat we de dag afsluiten.
Laten we een variabele toevoegen aan elk exemplaar van PlayState om aan te geven of het spel actief is of niet.

 module (?, package.seeall) functie PlayState () local PlayState = ? een hele hoop commentaarcode? function create () -: void PlayState._inGame = true PlayState._background = display.newRect (0, 0, display.contentWidth, display.contentHeight) PlayState._background: setFillColor (171, 204, 125)? commentaar gegeven op create () logica? einde create () einde

Dat zal later heel nuttig worden. Laten we ook de statusbalk aan de bovenkant van de iPhone verwijderen.
We willen dit alleen een keer doen wanneer de app wordt gelanceerd, dus voeg dit toe aan main.lua.

 local PlayState = require ("PlayState") function Main () -: void display.setStatusBar (display.HiddenStatusBar) PlayState.PlayState () end Main ()

Een andere belangrijke stap bij het maken van een Corona-app is om een ​​configuratiebestand toe te voegen dat Corona vertelt hoe het werkt
om uw app op andere platforms te schalen. In deze zelfstudie houden we ons alleen bezig met de iPhone's
schermgrootte (hoewel de app ook op Android zal draaien). Maak een bestand met de naam config.lua en vul het
hiermee.

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

Nu zal onze app ook op retina-schermen draaien. Opmerking: dit bestand werkt met elke Corona-app.

Conclusie

We hebben nu een werkkader om verder te bouwen. Onze app ziet er nog niet uit, maar wij
hebben veel van de belangrijke stappen in het porten van de ene taal naar de andere afgedekt. In de volgende
les in deze serie zullen we beginnen met het maken van een speelbaar spel.