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

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.

Dieses Tutorial fängt an, wo der erste Teil begann.

Das Schiff erstellen

Beginnen Sie mit der Portierung der Syntax aus der Quelldatei "de / pixelate / flixelprimer / Ship.as" wie beschrieben
am tag ein post. Insbesondere müssen Sie:

  • Befreien Sie sich von Paket- und Klassendeklarationen.
  • Entfernen Sie Typdeklarationen.
  • Fügen Sie allen Variablen "local" hinzu.
  • Ersetzen Sie die bedingten Klammern durch "dann" und "Ende"..
  • Löschen Sie alle Semikolons und kommentieren Sie alles aus.

Fügen Sie nun die Moduldeklaration oben in die Datei ein, damit wir die Datei in PlayState importieren können.
Fahren Sie außerdem fort und wickeln Sie den gesamten Code mit einer Ship () - Konstruktorfunktion ein. Ihr Code sollte jetzt so angeordnet sein:

 Funktion des Moduls (?, package.seeall) Ship ()? geht der kommentierte Code hier? Ende

Wir haben kein Flixel, also entfernen Sie die Import-Anweisung dafür. Schauen Sie sich jetzt die obersten Zeilen unserer an
Schiff () Funktion:

 Funktion Ship () - [Einbetten (Quelle = "? /? /? /? /assets/png/Ship.png")] private var ImgShip: Class - [[function Ship () -: void super (50 , 50, ImgShip) Ende -]]? Ende

Die erste Zeile lädt das Schiffsbild und speichert es in der Variablen ImgShip. Die nächsten Zeilen sind
die alte Konstruktormethode. Bei der Erstellung des Schiffes wurden dieser Funktion das Bild ImgShip und die Koordinaten (50, 50) zugewiesen. Wir können dasselbe tun, indem wir eine Schiffsvariable erstellen, die ein Bild enthält. Wir können das Bild mit dem in Lektion 1 verwendeten Anzeigemodul laden. Dann können Sie die Eigenschaften der Variablen x und y auf 50 setzen. Ersetzen Sie die obigen Zeilen, um Folgendes zu machen:

 Funktion Ship () local Ship = display.newImage ("Ship.png") Ship.x = 50 Ship.y = 50? kommentierter Code? Ende

Lassen Sie uns nun unsere Ship () - Funktion als Ship zurückgeben, damit unser PlayState es verwenden kann.

 Funktion Ship () local Ship = display.newImage ("Ship.png") Ship.x = 50 Ship.y = 50? kommentierter Code? rückkehr schiff ende

In unserer ActionScript-Quelle wird in PlayState ein Schiff erstellt, indem "new Ship ()" aufgerufen wird. Während wir da sind
Lassen Sie uns eine neue () - Funktion erstellen, die Ship () zurückgibt..

 Funktion Ship () local Ship = display.newImage ("Ship.png") Ship.x = 50 Ship.y = 50? kommentierter Code? return Schiffsende-Funktion new () return Schiff () Ende

Eigentlich gibt es keine technische Notwendigkeit dafür, aber es macht unseren Code etwas lesbarer.

Gehen Sie zurück zu PlayState.lua und fordern Sie oben unser Schiffsmodul an.

 module (?, package.seeall) local Ship = erfordern ("Ship") - Funktion PlayState ()? 

Jetzt können wir ein neues Schiff erstellen. Verschieben Sie zunächst alle deklarierten Variablendeklarationen vom Anfang der Datei in die Funktion create ().

 module (?, package.seeall) local Ship = erfordern ("Ship") - Funktion PlayState () local PlayState = ? eine ganze Reihe von kommentiertem Code? function create () -: void PlayState._inGame = true --local _ship --local _aliens --local _bullets --local _scoreText --local _gameOverText --local _spawnTimer --local _spawnInterval = 2.5 PlayState._background = display.newRect = (0, 0, display.contentWidth, display.contentHeight) PlayState._background: setFillColor (171, 204, 125)? kommentierte create () - Logik? Ende create () Ende

Lassen Sie sie kommentiert und machen Sie sie zu PlayState-Eigenschaften. Setzen Sie die Eigenschaften ohne Wert auf null. Wenn wir dabei sind, müssen wir eine _background-Deklaration machen.

? PlayState._background = nil --PlayState._ship = nil --PlayState._aliens = nil --PlayState._bullets = nil --PlayState._scoreText = nil --PlayState._gameOverText = nil --PlayState._spawnTate = nil --PlayState ._spawnInterval = 2.5? 

Kommentieren Sie die Deklaration der _ship-Variablen und erstellen Sie ein neues Schiff wie folgt:

 function create () -: void - Variablendeklarationen PlayState._inGame = true PlayState._background = nil PlayState._ship = nil --PlayState._aliens = nil --PlayState._bullets = nil --PlayState._scoreText = nil - PlayState._gameOverText = nil --PlayState._spawnTimer = nil --PlayState._spawnInterval = 2.5 - variable Zuweisungen PlayState._background = display.newRect (0, 0, display.contentWidth, display.contentHeight) PlayState._background: setFillColor , 204, 125) PlayState._ship = Ship.new ()? kommentierte create () - Logik? Ende

Beachten Sie hier, dass wir zuerst _background zuweisen. Dies liegt daran, dass Anzeigeobjekte in Corona geordnet sind
bis wann sie erstellt werden. Wir könnten _ship nicht sehen, wenn wir es vor _background erstellt hätten.

Wenn Sie den Code ausführen, wird jetzt ein Schiff um (50, 50) angezeigt..

Ein Blick auf Hardware-Einschränkungen

Wir müssen das Schiff bewegen können, um spielen zu können, aber wie können wir das tun? Das ursprüngliche Spiel wurde über eine Tastatur gesteuert. Ein iPhone hat keine Tastatur. Wie können wir das umgehen? Dies ist einer der vielen Faktoren, die beim Erstellen einer App für ein mobiles Gerät berücksichtigt werden müssen, unabhängig davon, ob Sie vorhandenen Code portieren oder eine komplett neue App erstellen. Eine andere, mit der wir uns bereits beschäftigen, ist die Bildschirmgröße. Auf einem Computer gibt es Programme in vielen verschiedenen Größen. Die meisten von ihnen sind sogar in ihrer Größe veränderbar. Auf einem iPhone haben Apps alle dieselbe Größe.

Die Lösung dieser Probleme kann eine Herausforderung sein. Um diese Einschränkungen zu umgehen, muss man denken
außerhalb der Box. Zum Beispiel könnten wir unser Schiff mit Tasten auf dem Bildschirm steuern. Wir könnten auch auf die Stelle auf dem Bildschirm tippen, an die sich das Schiff bewegen soll. Wir könnten sogar die Geräte benutzen
Beschleunigungsmesser, um das Schiff anhand der Neigung des Geräts zu steuern. Vielleicht ändern wir das Gameplay etwas und lassen das Schiff selbst steuern. Dann würde der Spieler nur das Schießen übernehmen. Wie Sie sehen, gibt es viele Möglichkeiten für neue Spielstile auf dem iPhone.

Virtuelle Schaltflächen erstellen

So ordentlich wie viele dieser Ideen auch sind, wir werden auf dem Bildschirm Schaltflächen zur Steuerung des Schiffes erstellen. Auf diese Weise wird das Spiel dem Original am besten entsprechen. Ich überlasse Ihnen diese anderen Optionen, um sie zu erkunden.

Ansca Mobile hat eine Open-Source-Bibliothek zum Erstellen virtueller Schaltflächen erstellt. Anstatt
Um die Bibliothek in Corona einzubauen, haben sie sie optional auf ihre Website gestellt. ich habe
Die aktuellste Version dieser Version wurde im Quellcode für dieses Tutorial enthalten. Ergänzen Sie die
"ui.lua" -Datei in Ihren Projektordner.

Gehen Sie zu Ihrer Ship.lua-Datei, damit wir einige Einstellungen vornehmen können. Fügen wir der Variablen Ship einige Eigenschaften hinzu. Direkt unterhalb des Codes, in dem wir die Schiffskoordinaten auf (50, 50) setzen, fügen Sie Folgendes hinzu:

? local Ship = display.newImage ("Ship.png") Ship.x = 50 Ship.y = 50 Ship._up = false Ship._down = false Ship._left = false Ship._right = false? 

Wir werden diese verwenden, um dem Schiff mitzuteilen, wann es sich bewegen soll. Wenn sich die Werte in true ändern, werden die entsprechenden Tasten gedrückt.

Zurück in PlayState.lua müssen wir eine neue Funktion erstellen, um Schaltflächen erstellen zu können. Wir werden das außerhalb von PlayState () erledigen, da es etwas unordentlich wird. Bevor wir weiterziehen,
Vergewissern Sie sich, dass Sie alle Schaltflächenbilder aus der in diesem Lernprogramm enthaltenen Quelle haben. Erstellen Sie jetzt eine buttonHandler () - Funktion unter PlayState ()..

? Funktion PlayState ()? Funktion beenden buttonHandler (PlayState) Ende

Beachten Sie, dass buttonHandler () ein Argument benötigt: PlayState. Das liegt daran, dass wir schaffen
buttonHandler () außerhalb der PlayState () - Funktion. Wenn Sie sich an die erste Lektion erinnern, bedeutet dies
Der buttonHandler () hat keine Ahnung, was die PlayState-Variable ist, da der PlayState lokal ist
PlayState () - Funktion. Wir rufen buttonHandler () von PlayState () aus an. Durchgehen
PlayState an buttonHandler (), erlauben wir buttonHandler (), alle PlayState und ihre Eigenschaften anzuzeigen und zu ändern. Da _ship eine Eigenschaft von PlayState ist, kann buttonHandler () gesetzt werden
_ship_up, _ship._down usw.

Wir importieren das Modul ui.lua in unsere buttonHandler-Funktion anstelle von oben
PlayState.lua. Sie werden später sehen, warum.

? Funktion PlayState ()? Funktion beenden buttonHandler (PlayState) local ui = Ende der Anforderung ("ui")

Jetzt wird es etwas unordentlich. Wir werden für jede Taste zwei Funktionen erstellen. Ein
wenn die Taste gedrückt wird und eine Taste, wenn die Taste losgelassen wird. Wenn diese aufgerufen werden, werden die Eigenschaften des Schiffs auf true oder false festgelegt.

 function buttonHandler (PlayState) local ui = erfordern ("ui") - Funktion upPressed () PlayState._ship._up = true Ende Funktion upReleased () PlayState._ship._up = false Ende Funktion downPressed () PlayState._ship._down = true Ende function downReleased () PlayState._ship._down = false Ende Funktion leftPressed () PlayState._ship._left = true Ende Funktion leftReleased () PlayState._ship._left = false Ende Funktion rightPressed () PlayState._ship._right = true Ende Funktion rightReleased () PlayState._ship._right = falsches Ende

Weil wir PlayState an buttonHandler () übergeben, und _ship und alle seine Eigenschaften gehören dazu
PlayState, wir können sie von wahr nach falsch und umgekehrt ändern. Jetzt müssen wir die eigentlichen Buttons erstellen. Mit dem importierten ui-Modul können wir eine seiner Methoden verwenden: newButton. Dies hat einige interessante Syntax, also hängen Sie fest.

 PlayState._upButton = ui.newButton defaultSrc = "up.png", defaultX = "50", defaultY = "50", overSrc = "up.png", overX = "50", overY = "50", onPress = upPressed, onRelease = upReleased, id = "_upButton"

Dieser Code ruft newButton auf und weist das Ergebnis _upButton (einer Eigenschaft von PlayState) zu. Zu Beginn,
Sie fragen sich vielleicht, warum es Klammern gibt. Dies ist keine Ausnahme zu den Regeln der Lua-Syntax.
Tatsächlich enthalten die Klammern ein Array von Parametern, die an die newButton-Methode übergeben werden. Es gibt viele Parameter hier, gehen wir also einzeln vor. Die erste, defaultSrc ist die Position des Bildes, die verwendet werden soll, wenn die Schaltfläche nicht gedrückt wird. defaultX und defaultY sind die Abmessungen des Bildes. overSrc ist der Ort des Bildes, das angezeigt wird, wenn die Taste gedrückt wird. In diesem Fall verwenden wir dasselbe Bild. overX und overY funktionieren genauso wie defaultX und defaultY, sind aber die Maße für overSrc. onPress ist die Funktion, die aufgerufen wird, wenn die Taste gedrückt wird. Dies ist eine der Funktionen, die wir zuvor erstellt haben. onRelease ist das gleiche wie onPress, wird jedoch beim Loslassen der Schaltfläche aufgerufen. id ist eine benannte Zeichenfolge, um diese Schaltfläche von anderen zu unterscheiden. Jede Schaltfläche verfügt über eine x- und eine y-Eigenschaft, genau wie andere Anzeigeobjekte, die jederzeit angepasst werden können.

Nun, da wir wissen, wie Knöpfe funktionieren, machen wir den Rest. Fügen Sie dies auf der Unterseite von hinzu
buttonHandler ():

 Funktion ButtonHandler ()? PlayState._upButton = ui.newButton defaultSrc = "up.png", defaultX = "50", defaultY = "50", overSrc = "up.png", overX = "50", overY = "50", onPress = upPressed, onRelease = upReleased, id = "_upButton" PlayState._upButton.x = display.contentWidth - 100 PlayState._upButton.y = display.contentHeight - 100 PlayState._downButton = ui.newButton = default = defaultX = "50", defaultY = "50", overSrc = "down.png", overX = "50", overY = "50", onPress = downPressed, onRelease = downReleased, id = "_downButton" PlayState._downButton. x = display.contentWidth - 100 PlayState._downButton.y = display.contentHeight - 50 PlayState._leftButton = ui.newButton defaultSrc = "left.png", defaultX = "50", defaultY = "50", overSrc = "übrig .png ", overX =" 50 ", overY =" 50 ", onPress = leftPressed, onRelease = leftReleased, id =" _leftButton " PlayState._leftButton.x = display.contentWidth - 150 PlayState._leftButton.y = display.contentHeight - 75 PlayState._rightButton = ui.new Button defaultSrc = "right.png", defaultX = "50", defaultY = "50", overSrc = "right.png", overX = "50", overY = "50", onPress = rightPressed, onRelease = rightReleased, id = "_rightButton" PlayState._rightButton.x = display.contentWidth - 50 PlayState._rightButton.y = display.contentHeight - 75 Ende

Wenn wir buttonHandler () in der create () - Funktion von PlayState () einen Aufruf hinzufügen, haben wir vier
Pfeile unten rechts auf dem Bildschirm.

 Funktion PlayState ()? Funktion erstellen ()? PlayState._ship = Ship.new () buttonHandler (PlayState)? Ende

Die Spielschleife

Jetzt müssen wir eine Schleife erstellen, um das Gameplay zu handhaben. Im ursprünglichen Code wurde dazu die Funktion update () verwendet. Wir werden dasselbe mit unserem Code machen. Genauso wie bei der create () - Funktion, kommentieren Sie die update () - Funktion aus und setzen Sie einzeilige Kommentare vor allen inneren Zeilen.

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

Auf Ereignisse hören

Um die update () - Funktion wiederholt wie in flixel aufrufen zu können, müssen Sie ein Ereignis hinzufügen
Hörer. Diese Codezeile setzt update () so, dass sie bei jedem neuen Frame aufgerufen wird. Füge es in create () hinzu
Funktion.

 Funktion create () -: nichtig? buttonHandler (PlayState) Laufzeit: addEventListener ("enterFrame", Update)? Ende

Überprüfen, ob das Spiel vorbei ist

Lassen Sie uns prüfen, ob das Spiel noch läuft, bevor Sie die Spielschleife loslassen. Erinnere dich an diese Variable
"PlayState._inGame"? Wir werden es benutzen, um zu überprüfen, ob das Spiel vorbei ist. Umgeben Sie also den kommentierten update () - Code mit dieser Anweisung.

 function update () -: ungültig, wenn PlayState._inGame dann? kommentierter Code? Ende Ende

Handhabung von Schiffsbewegungen

Um das Schiff in Bewegung zu setzen, müssen wir die update () - Funktion von Ship.lu zum Laufen bringen. Ändern Sie wie zuvor die Kommentare, sodass die Funktionsdeklaration nicht mehr kommentiert wird, sondern alles andere. Fügen Sie den gleichen Ereignis-Listener unmittelbar vor dem Ende von Ship () hinzu..

 Funktion Schiff ()? Laufzeit: addEventListener ("enterFrame", Update) Rückgabe Ende

Wir müssen auch prüfen, ob die Variable "Ship" existiert und nicht null ist. Wickeln Sie den Kommentar ein
Code mit dieser if-Anweisung.

 Funktion Update () Wenn Schiff dann? kommentierter Code? Ende Ende

Lassen Sie uns nun die kommentierten Zeilen durcharbeiten. Die ersten beiden Werte setzen die Schiffsgeschwindigkeit auf 0.
Corona hat keine Geschwindigkeit wie Flixel, also arbeiten wir mit x und y des Schiffes
direkt. Die nächsten acht Zeilen prüfen, ob die linke oder rechte Pfeiltaste auf der Tastatur gedrückt wird. Wir
kann dies durch Prüfungen für die Variablen _left und _right ersetzen. Da haben wir keine Geschwindigkeit zu
arbeiten wir mit, setzen wir den x-Wert des Schiffes einfach auf plus oder minus 5.

 Wenn (Ship._left) dann Ship.x = Ship.x - 5 elseif (Ship._right), dann Ship.x = Ship.x + 5 Ende

Gleiches gilt für auf und ab.

 Wenn (Ship._up), dann Ship.y = Ship.y - 5 elseif (Ship._down), dann Ship.y = Ship.y + 5 Ende

Sie können "super.update ()" löschen.

Das Spiel in einer Grenze halten

Wenn Sie das Spiel jetzt ausführen würden, würde sich das Schiff ordnungsgemäß bewegen. Das Problem ist, es wird fliegen
direkt vom Bildschirm oder in die Steuerelemente, wenn wir es zulassen. Das ursprüngliche Spiel hatte auch dieses Problem. So,
Die nächsten Codezeilen in der update () - Funktion hindern das Schiff daran, eine Grenze zu verlassen. Es
Dazu wird geprüft, ob sich das Schiff nach allen x- und y-Änderungen außerhalb der Grenze befindet
sind durch Wenn sich das Schiff außerhalb befindet, wird es wieder auf den maximal zulässigen Wert verschoben. Wir werden das Gleiche tun, und wir können dieselbe display.contentWidth und contentHeight wie im Hintergrund verwenden, um die Bildschirmgröße zu ermitteln.

 Wenn (Ship.x> display.contentWidth-Ship.contentWidth-16), dann Ship.x = display.contentWidth-Ship.contentWidth-16 elseif (Ship.x < Ship.contentWidth+16) then Ship.x = Ship.contentWidth+16 end if(Ship.y > display.contentHeight-Ship.contentHeight-150) dann Ship.y = display.contentHeight-Ship.contentHeight-150 elseif (Ship.y < Ship.contentHeight+16) then Ship.y = Ship.contentHeight+16 end

Ich habe die Zahlen etwas geändert, damit das Schiff die Knöpfe nicht überlappt.

Aufzählungszeichen und Anzeigegruppen

Jetzt müssen wir unser Schiff schießen lassen. Schauen wir uns mal "de / pixelate / flixelprimer / Bullet.as" an. Gehen
durch den normalen Syntax-Konvertierungsprozess. Zum Glück ist das wirklich einfach. Löschen Sie alles außer dem Bullet () -Konstruktor. Fügen Sie die Moduldeklaration hinzu und speichern Sie sie als Bullet.lua in Ihrem Projektordner.

Wir haben jetzt eine Bullet () - Funktion, die einen X- und einen Y-Wert annimmt. Daraufhin wird ein grünes Rechteck erstellt
koordiniert, und es setzt seine Geschwindigkeit auf 1000.

Lassen Sie uns das Rechteck erstellen, das wie das Aufzählungszeichen auf dieselbe Weise wirkt, wie wir es im ersten Hintergrund gemacht haben
Lektion.

 Funktion des Moduls (?, package.seeall) Bullet (x, y) -: void local Bullet = display.newRect (x, y, 16, 4) - super (x, y) --createGraphic (16, 4, 0xFF597137) --velocity.x = 1000 end

Dieser Code erstellt ein 16 x 4 Pixel großes Quadrat und setzt seine X- und Y-Koordinaten auf die an Bullet (x, y) übergebenen Zahlen. Jetzt ändern wir die Füllfarbe der Kugel. # 587137 in RGB konvertiert ist (89, 113, 55).

 Funktion des Moduls (?, package.seeall) Bullet (x, y) -: void local Bullet = display.newRect (x, y, 16, 4) Bullet: setFillColor (89, 113, 55) --velocity.x = 1000 ende

Fügen Sie eine neue () - Funktion hinzu, wie Sie es mit Ship.lua getan haben.

 Funktion des Moduls (?, package.seeall) Bullet (x, y) -: void local Bullet = display.newRect (x, y, 16, 4) Bullet: setFillColor (89, 113, 55) --velocity.x = 1000 return Aufzählungsende-Funktion new (x, y) return Aufzählungsende (x, y) Ende

Dieser Code akzeptiert nur einen X- und einen Y-Wert und gibt an dieser Stelle ein neues Aufzählungszeichen zurück. Stellen Sie sicher, dass
Fügen Sie am Ende von Bullet () "return Bullet" ein, damit PlayState es verwenden kann.

Jetzt müssen wir die Geschwindigkeit neu erstellen. Erstellen wir eine update () - Funktion wie für das Schiff.

? Funktion Bullet (x, y) -: void local Bullet = display.newRect (x, y, 16, 4) Bullet: setFillColor (89, 113, 55) Funktion update (), wenn Bullet dann Bullet.x = Bullet.x ist + 10 end end Runtime: addEventListener ("enterFrame", update) gibt das Bullet-Ende zurück? 

Jetzt bewegt sich das Aufzählungszeichen bei jedem Frame um zehn Pixel nach rechts.

Refactoring-Button-Code: Hinzufügen eines Feuerknopfs

Jetzt brauchen wir eine Methode, um die Kugeln abzufeuern. Fügen wir eine weitere Schaltfläche hinzu. Erstens benötigen wir eine Variable, um den Überblick zu behalten, ob die Schaltfläche gedrückt wird oder nicht. Anstatt dies in der Ship.lua-Datei zu behandeln, können Sie diese Variable in der create () - Funktion in PlayState.lua am unteren Rand der
Variablendeklarationen.

? function create () -: void - Variablendeklarationen PlayState._inGame = true PlayState._background = nil PlayState._ship = nil --PlayState._aliens = nil --PlayState._bullets = nil --PlayState._scoreText = nil - PlayState._gameOverText = nil --PlayState._spawnTimer = nil --PlayState._spawnInterval = 2.5 PlayState._shoot = nil? Ende? 

Setzen Sie es in den Variablenzuweisungen unter der neuen Schiffslinie auf "false".

? Funktion create () -: nichtig? - variable Zuweisungen PlayState._background = display.newRect (0, 0, display.contentWidth, display.contentHeight) PlayState._background: setFillColor (171, 204, 125) PlayState._ship = Ship.new () PlayState._shoot = false ? Ende? 

Jetzt müssen wir unserer buttonHandler () - Funktion ein paar Zeilen hinzufügen. Wir benötigen zwei weitere Funktionen, um die neue Taste zu drücken und loszulassen. Fügen Sie diese beiden Funktionen nach rightPressed () und hinzu
rightReleased ().

? FunktionstasteHandler (PlayState)? function leftPressed () PlayState._ship._left = true Funktion beenden leftReleased () PlayState._ship._left = false Funktion beenden rightPressed () PlayState._ship._right = true Funktion beenden rightReleased () PlayState._ship._right = false Funktion beenden shootPressed () PlayState._shoot = true Ende Funktion shootReleased () PlayState._shoot = falsches Ende? Ende? 

Laden Sie nun den Button wie zuvor.

? FunktionstasteHandler (PlayState)? PlayState._shootButton = ui.newButton defaultSrc = "shoot.png", defaultX = "100", defaultY = "100", overSrc = "shoot.png", overX = "100", overY = "100", onRelease = shootReleased, onPress = shootPressed, id = "_shootButton" PlayState._shootButton.x = 75 PlayState._shootButton.y = display.contentHeight - 75 end? 

Unser Knopfcode wird etwas unordentlich. Verschieben Sie den gesamten buttonHandler () in eine neue Datei mit dem Namen
Buttons.lua. Vergessen Sie nicht die Moduldeklaration.

Importieren Sie das neue Button-Modul oben in PlayState. Während wir dort sind, lassen Sie uns auch Bullet importieren.

 module (?, package.seeall) local Ship = Required ("Ship") Local Bullet = Requirement ("Bullet") Local Buttons = Requirement ("Buttons") Funktion PlayState ()? 

Ändern Sie die Schaltfläche buttonHandler () in create (), um die Funktion des Moduls aufzurufen.

 Funktion create () -: nichtig? PlayState._ship = Ship.new () PlayState._shoot = false Buttons.buttonHandler (PlayState)? Ende

Platzieren von Kugeln relativ zum Schiff

Jetzt müssen wir einige Funktionen für das Bullet-Handling neu erstellen. Schauen wir uns getBulletSpawnPosition () an.
in Ship.lua.

 --[[Funktion getBulletSpawnPosition () -: FlxPoint local p = neuer FlxPoint (x + 36, y + 12) Rückgabe p end -]]

Die ursprüngliche Funktion war eine Instanzmethode des Schiffs. Es wurde ein X- und ein Y-Wert zurückgegeben, um ein neues Aufzählungszeichen zu erstellen. Da es sich um eine Instanzmethode handeln soll, müssen wir sie wie eine funktionieren lassen. Lassen Sie uns die Ship-Variable als eigenständig definieren.

 Funktion Ship: getBulletSpawnPosition () -: FlxPoint local p = new FlxPoint (x + 36, y + 12) geben p end zurück

Da es sich bei FlxPoint um einen exklusiven Typ für Flixel handelt, geben wir stattdessen ein Array zurück.

 Funktion Ship: getBulletSpawnPosition () local p = x = Ship.x + 36, y = Ship.y + 2 return p end

Dieser Code addiert 36 zum X-Wert des Schiffes und 2 (Ich habe 2 anstelle von 12 verwendet, um die Kugel einzustellen
Position für Corona) auf den Y-Wert des Schiffes. Diese werden in einem assoziativen Array gespeichert. Wir können jetzt
Zugriff auf jede Nummer mit p.x und p.y.

Im ursprünglichen Code enthielt eine Variable im PlayState mit dem Namen _bullets alle Aufzählungsinstanzen.
Dasselbe können wir mit einer Anzeigegruppe machen. Eine Anzeigegruppe in Corona enthält lediglich eine Reihe von Anzeigeobjekten und zeigt diese an. Dies ist nützlich, um ein Bündel derselben Art zu verwalten
Objekt. Wenn Objekte zu Anzeigegruppen hinzugefügt werden, werden sie in der Reihenfolge angezeigt, in der sie angezeigt werden
Gruppen werden erstellt. Wenn wir beispielsweise eine Reihe von Kugeln und eine Reihe von Außerirdischen haben und wir möchten, dass alle Außerirdischen an der Spitze stehen, könnten wir eine Aufzählungsgruppe und dann eine Außerirdische-Anzeigegruppe erstellen. Wenn wir alle Gruppen von Aufzählungszeichen und Fremdobjekten zu ihren Gruppen hinzufügen, werden diese immer in der richtigen Reihenfolge angezeigt. Dies geschieht auch dann, wenn eine Kugel nach einem Alien erstellt wird. Der Ausländer wird oben angezeigt, da die Anzeigegruppe von der Anzeigegruppe gesteuert wird.

Kommentieren Sie die Zeile "--PlayState._bullets = nil" in der create () - Funktion in PlayState.lua.

 Funktion create () -: void - Variablendeklarationen PlayState._inGame = true PlayState._background = nil PlayState._ship = nil --PlayState._aliens = nil PlayState._bullets = nil --PlayState._scoreText = nil --PlayState. _gameOverText = nil --PlayState._spawnTimer = nil --PlayState._spawnInterval = 2.5 PlayState._shoot = nil? Ende

Machen Sie _bullets zu einer neuen Anzeigegruppe in den Variablenzuweisungen.

 Funktion create () -: nichtig? PlayState._ship = Ship.new () PlayState._shoot = false PlayState._bullets = display.newGroup () Buttons.buttonHandler (PlayState)? Ende

Nun werfen Sie einen Blick auf spawnBullet ().

 --[[function spawnBullet (p) -: void local bullet = neues Bullet (p.x, p.y) _bullets.add (bullet) FlxG.play (SoundBullet) Ende -]]

Dieser Code ist eigentlich ziemlich nah an dem, was wir wollen. Lass es so aussehen:

 Funktion spawnBullet (p) -: void local _bullet = Bullet.new (p.x, p.y) PlayState._bullets: insert (_bullet) PlayState._shoot = false --FlxG.play (SoundBullet) Ende

Beim Erstellen des Aufzählungszeichens muss _shoot wieder auf false gesetzt werden. Auf diese Weise muss der Benutzer anheben
ihre Finger, bevor sie wieder feuern.

Grundlegende Sounds behandeln

Corona verfügt über eine grundlegende API zum Abspielen kurzer Soundeffekte. Um es verwenden zu können, müssen wir .caf-Ton verwenden
Dateien. Die konvertierte Version der ursprünglichen MP3-Soundeffekte ist dafür in der Quelle enthalten
Tutorial.

Zuerst müssen wir Variablen erstellen, um die Sounds zu halten. Es gibt drei Zeilen am oberen Rand von PlayState.
Verschiebe sie zu den Variablendeklarationen in create ().

 Funktion create () -: void - Variablendeklarationen PlayState._inGame = true PlayState._background = nil PlayState._ship = nil --PlayState._aliens = nil PlayState._bullets = nil --PlayState._scoreText = nil --PlayState. _gameOverText = nil --PlayState._spawnTimer = nil --PlayState._spawnInterval = 2.5 PlayState._shoot = nil - [Embed (source = "? /? /? /? /assets/mp3/ExplosionShip.mp3")] private var SoundExplosionShip: Klasse - [Einbetten (Quelle = "? /? /? /? /Assets/mp3/ExplosionAlien.mp3")] private var SoundExplosionAlien: Klasse - [Einbetten (Quelle = "? /? /? /? / assets / mp3 / Bullet.mp3 ")] private var SoundBullet: Klasse? Ende

Wir möchten nur, dass die Namen gleich sind. Machen Sie sie zu PlayState-Eigenschaften und setzen Sie sie auf Null.
Kommentieren Sie die letzte Zeile.

 Funktion create () -: void - Variablendeklarationen PlayState._inGame = true PlayState._background = nil PlayState._ship = nil --PlayState._aliens = nil PlayState._bullets = nil --PlayState._scoreText = nil --PlayState. _gameOverText = nil --PlayState._spawnTimer = nil --PlayState._spawnInterval = 2.5 PlayState._shoot = nil --PlayState.SoundExplosionShip = nil --PlayState.SoundExplosionAlien: Class = nil PlayState.SoundBullet = nil? Ende

Jetzt verwenden wir das Medienmodul, um einen neuen Sound zu laden. Setzen Sie dies an die Unterseite der Zuordnungen:

 Funktion create () -: nichtig? PlayState._ship = Ship.new () PlayState._shoot = false PlayState._bullets = display.newGroup () PlayState.SoundBullet = media.newEventSound ("Bullet.caf") Buttons.buttonHandler (PlayState)? Ende

Zurück zu SpawnBullet (). Wir können die letzte Zeile ersetzen, um unseren neuen Sound abzuspielen.

 Funktion spawnBullet (p) -: void local _bullet = Bullet.new (p.x, p.y) PlayState._bullets: insert (_bullet) PlayState._shoot = false media.playEventSound (PlayState.SoundBullet) Ende

Jetzt müssen wir nur noch die update () - Funktion ändern, um ein paar Schussgeschosse zu erhalten. Prüfen Sie, ob _shoot ist
wahr und wenn _schiff existiert. Rufen Sie in diesem Fall unsere Instanzmethode getBulletSpawnPosition () für unser Schiff auf
und spawnBullet () an dieser Stelle.

 Funktion update () wenn PlayState._inGame und dann PlayState._shoot == true und PlayState._ship dann local p = PlayState._ship: getBulletSpawnPosition () spawnBullet (p) Ende? Ende Ende

Grundlegende Speicherverwaltung

In Flixel wurde das Gedächtnis für uns gepflegt. In Corona müssen wir Objekte bereinigen
sind fertig mit. Fügen wir jedem Aufzählungspunkt eine kill () - Instanzmethode hinzu, die uns helfen soll. kill () ist das
Diese Funktion ruft automatisch auf, wenn ein Objekt nicht mehr benötigt wird. Fügen Sie dies zu Bullet.lua hinzu:

 Funktion Aufzählungszeichen (x, y)? Funktionsaktualisierung ()? Funktion beenden Bullet: kill () Bullet.parent: (Bullet) entfernen Bullet = null Ende? Ende

Dies ist der richtige Weg, um ein Objekt in Corona zu bereinigen. Zuerst haben wir alle Bindungen entfernt, indem wir sie entfernt haben
es aus der Anzeigegruppe. Dann setzen wir die Bullet-Variable auf null. Machen wir dasselbe für Ship.
Fügen Sie Folgendes unter getBulletSpawnPosition () in Ship.lua hinzu:

 Funktion Ship: kill () Ship: removeSelf () Ship = nil Laufzeit: removeEventListener ("enterFrame", update) end

Beachten Sie, dass wir das Update nicht für jeden Frame aufgerufen haben (da das Schiff nicht existiert
nicht mehr).

Umgang mit Off-Screen-Kugeln

Zurück zu Bullet.lua fügen wir in jedem Frame eine Überprüfung hinzu, um zu sehen, ob sich der Punkt außerhalb der Anzeige befindet.
Derzeit zeichnet unser Code weiterhin Aufzählungszeichen, auch wenn sie nicht gesehen werden können. Dies ist eine Verschwendung der begrenzten Ressourcen des Geräts. Ersetzen Sie update () damit:

 Funktion update () wenn Bullet dann if (Bullet.x < display.contentWidth) then Bullet.x = Bullet.x + 10 else Bullet:kill() end end end

Jetzt bewegt sich die Kugel nur dann nach rechts, wenn sie gesehen werden kann. Ansonsten wird es unser Handy anrufen
Funktion kill ().

Müllsammlung

Lua verfügt über einen automatischen Speicherbereiniger, der den Papierkorb wie nicht verwendete Variablen behandelt, Objekte anzeigt, die aus der Anzeige entfernt wurden, und alles andere, was nicht mehr benötigt wird. Wir können Lua anweisen, Müll zu sammeln, ind