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.
Deze tutorial neemt op waar deel één begon.
Begin met porten van de syntaxis van het bronbestand "de / pixelate / flixelprimer / Ship.as" zoals beschreven
op de dag één post. In het bijzonder moet u:
Voeg nu de module-declaratie aan de bovenkant van het bestand toe, zodat we het bestand in PlayState kunnen importeren.
Ook, ga je gang en wikkel alle code met een Ship () constructorfunctie. Uw code moet nu als volgt worden ingedeeld:
module (?, package.seeall) functie Ship ()? komt alle code met commentaar hier? einde
We hebben geen flixel, dus ontdoe je van de importverklaring ervoor. Kijk nu naar de topregels van onze
Ship () functie:
function Ship () - [Embed (source = "? /? /? /? /assets/png/Ship.png")] private var ImgShip: Class - [[function Ship () -: void super (50 , 50, ImgShip) einde -]]? einde
De eerste regel laadt de scheepsafbeelding en slaat deze op in de variabele ImgShip. De volgende paar regels zijn
de oude constructormethode. Toen het schip werd gemaakt, heeft deze functie de afbeelding ImgShip en de coördinaten (50, 50) toegewezen gekregen. We kunnen hetzelfde doen door een Ship-variabele te maken die een afbeelding bevat. We kunnen de afbeelding laden met behulp van de weergavemodule die we in les 1 hebben gebruikt. Vervolgens kunnen we de variabelen x- en y-eigenschappen instellen op 50. Vervang de bovenstaande regels om het volgende te maken:
function Ship () local Ship = display.newImage ("Ship.png") Ship.x = 50 Ship.y = 50? commentaarcode? einde
Laten we nu onze Ship () -functie terugzenden zodat onze PlayState deze kan gebruiken.
function Ship () local Ship = display.newImage ("Ship.png") Ship.x = 50 Ship.y = 50? commentaarcode? terugkeer einde van het schip
In onze ActionScript-bron wordt een schip in PlayState gemaakt door "new Ship ()" te bellen. Terwijl we er zijn
het, laten we een nieuwe () functie maken die Ship () retourneert.
function Ship () local Ship = display.newImage ("Ship.png") Ship.x = 50 Ship.y = 50? commentaarcode? return Ship end-functie nieuw () return Ship () einde
Echt, er is geen technische noodzaak voor, maar het maakt onze code wel een beetje leesbaarder.
Ga terug naar PlayState.lua en vraag onze Ship-module bovenaan.
module (?, package.seeall) local Ship = require ("Ship") functie PlayState ()?
Nu kunnen we een nieuw schip maken. Verplaats eerst alle van commentaar voorziene variabelieverklaringen vanaf de bovenkant van het bestand naar de create () -functie.
module (?, package.seeall) local Ship = require ("Ship") functie PlayState () local PlayState = ? een hele hoop commentaarcode? 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)? commentaar gegeven op create () logica? einde create () einde
Laat hen commentaar geven, maak ze eigenschappen van PlayState. Stel de eigenschappen zonder waarde op nul in. Terwijl we bezig zijn, moeten we een'background'-verklaring opstellen.
? 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?
Noteer de verklaring van de _ship variabele en maak een nieuw schip zoals dit:
function create () -: void - variable declarations PlayState._inGame = true PlayState._background = nil PlayState._ship = nil - PlayState._aliens = nil - PlayState._ship = nil - PlayState._scoreText = nil - PlayState._gameOverText = nil - PlayState._spawnTimer = nil - PlayState._spawnInterval = 2.5 - variabelen toewijzingen PlayState._background = display.newRect (0, 0, display.contentWidth, display.contentHeight) PlayState._background: setFillColor (171 , 204, 125) PlayState._ship = Ship.new ()? commentaar gegeven op create () logica? einde
Merk hier op dat we _background eerst toewijzen. Dit komt omdat weergave-objecten in Corona zijn besteld
door wanneer ze zijn gemaakt. We zouden het schip niet kunnen zien als we het vóór _background gemaakt hebben.
Als je de code uitvoert, wordt er nu een schip weergegeven op (50, 50).
We moeten het schip kunnen verplaatsen om te kunnen spelen, maar hoe kunnen we? Het originele spel is gemaakt om te worden bestuurd door een toetsenbord. Een iPhone heeft geen toetsenbord. Hoe kunnen we dit omzeilen? Dit is een van de vele factoren waarmee rekening moet worden gehouden bij het maken van een app voor een mobiel apparaat, ongeacht of u bestaande code porteert of helemaal niets meer maakt. Een andere die we al behandelen is de schermgrootte. Op een computer zijn programma's in veel verschillende grootten verkrijgbaar. De meeste zijn zelfs aanpasbaar. Op een iPhone zijn apps allemaal even groot.
Het oplossen van deze problemen kan een uitdaging zijn. Om deze beperkingen te omzeilen, moet je nadenken
buiten de doos. We kunnen ons schip bijvoorbeeld besturen met knoppen op het scherm. We kunnen ook tikken op de locatie op het scherm waarnaar we het schip willen verplaatsen. We zouden zelfs de apparaten kunnen gebruiken
versnellingsmeter om het schip te besturen op basis van de kanteling van het apparaat. Misschien veranderen we de gameplay een beetje en maken het schip zelf de controle. Dan zou de speler gewoon de leiding hebben over de schietpartij. Zoals je kunt zien, zijn er veel mogelijkheden voor nieuwe gamestijlen op de iPhone.
Zo netjes als veel van die ideeën waren, gaan we knoppen op het scherm maken om het schip te besturen. Op deze manier komt het spel het meest overeen met het origineel. Ik laat die andere opties voor je achter om te verkennen.
Ansca Mobile heeft een open-sourcebibliotheek gemaakt voor het maken van virtuele knoppen. In plaats van
het bouwen van de bibliotheek in Corona, ze hebben het op hun website opgenomen als optioneel. ik heb
bevatte de nieuwste versie vanaf dit schrijven in de broncode voor deze zelfstudie. Voeg de toe
"ui.lua" bestand naar uw projectmap.
Ga naar je Ship.lua-bestand zodat we wat kunnen instellen. Laten we een paar eigenschappen toevoegen aan onze variabele Ship. Net onder de code waar we de scheepscoördinaten op zetten (50, 50) voeg je dit toe:
? local Ship = display.newImage ("Ship.png") Ship.x = 50 Ship.y = 50 Ship._up = false Ship._down = false Ship._left = false Ship._right = false?
We gaan deze gebruiken om het schip te vertellen wanneer te bewegen. Als de waarden veranderen in true, betekent dit dat de respectieve knoppen worden ingedrukt.
Terug in PlayState.lua, moeten we een nieuwe functie maken om het maken van knoppen te beheren. We gaan dit buiten PlayStation () doen omdat het een beetje rommelig gaat worden. Voordat we verder gaan,
zorg ervoor dat alle knopafbeeldingen van de bron in deze zelfstudie zijn opgenomen. Maak nu een buttonHandler () -functie onder PlayState ().
? functie PlayState ()? eindfunctie buttonHandler (PlayState) einde
Merk op dat buttonHandler () een argument neemt: PlayState. Dit komt omdat we aan het creëren zijn
buttonHandler () buiten de PlayState () -functie. Als je je dat bij de eerste les herinnert, betekent dit
dat buttonHandler () geen idee heeft wat de variabele PlayState is, omdat PlayState lokaal is voor de
PlayState () functie. We zullen buttonHandler () aanroepen vanuit PlayState (). Door te passeren
PlayState to buttonHandler (), we laten buttonHandler () toe om alle PlayState en zijn eigenschappen te zien en te wijzigen. Omdat _ship een eigenschap van PlayState is, kan buttonHandler () worden ingesteld
_ship_up, _ship._down, enz.
We gaan de ui.lua-module importeren in onze buttonHandler-functie in plaats van bovenaan
PlayState.lua. Je zult later zien waarom.
? functie PlayState ()? eindfunctie buttonHandler (PlayState) local ui = require ("ui") einde
Nu wordt het een beetje rommelig. We gaan voor elke knop twee functies maken. een
voor wanneer de knop wordt ingedrukt en één voor wanneer de knop wordt losgelaten. Wanneer deze worden genoemd, stellen ze de eigenschappen van het schip in op true of false.
function buttonHandler (PlayState) local ui = require ("ui") function upPressed () PlayState._ship._up = true end function upReleased () PlayState._ship._up = false end functie downPressed () PlayState._ship._down = true end function downReleased () PlayState._ship._down = false end function leftPressed () PlayState._ship._left = true end function leftReleased () PlayState._ship._left = false end function rightPressed () PlayState._ship._right = true end function rightReleased () PlayState._ship._right = valse end-end
Omdat we PlayState doorgeven aan buttonHandler (), en _ship en alle eigenschappen ervan toebehoren
PlayState, we kunnen ze veranderen van waar naar onwaar en vice versa. Nu moeten we de eigenlijke knoppen maken. Met de geïmporteerde ui-module kunnen we een van de volgende methoden gebruiken: newButton. Dit heeft een aantal interessante syntaxis, dus hou het goed.
PlayState._upButton = ui.newButton defaultSrc = "up.png", defaultX = "50", defaultY = "50", overSrc = "up.png", overX = "50", overY = "50", onPress = upPressed, onRelease = upReleased, id = "_upButton"
Deze code roept newButton op en wijst het resultaat toe aan _upButton (een eigenschap van PlayState). Aanvankelijk,
je vraagt je misschien af waarom er haakjes zijn. Dit is geen uitzondering op de regels van de lua-syntaxis.
Eigenlijk houden de haakjes een array parameters vast die worden doorgegeven aan de methode newButton. Er zijn hier veel parameters, dus laten we ze een voor een bekijken. De eerste, defaultSrc is de locatie van de afbeelding die moet worden gebruikt wanneer niet op de knop wordt gedrukt. defaultX en defaultY zijn de afmetingen van de afbeelding. OverSrc is de locatie van de afbeelding die moet worden weergegeven wanneer op de knop wordt gedrukt. In dit geval gaan we dezelfde afbeelding gebruiken. overX en overY werken net als defaultX en defaultY, maar dit zijn de dimensies voor overSrc. onPress is de functie om te bellen wanneer op de knop wordt gedrukt. Dit is een van de functies die we eerder hebben gemaakt. onRelease is hetzelfde als onPress, maar het wordt aangeroepen voor de release van de knop. id is een benoemde reeks om deze knop te onderscheiden van anderen. Elke knop heeft een x- en een y-eigenschap net als andere weergaveobjecten die op elk moment kunnen worden aangepast.
Nu we weten hoe knoppen werken, laten we de rest ervan maken. Voeg dit toe onderaan
buttonHandler ():
function 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 defaultSrc = "down.png", 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 = "left .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 Knop 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 end
Als we een aanroep van buttonHandler () toevoegen aan de create () -functie van PlayState (), krijgen we er vier
pijlen rechtsonder op het scherm.
functie PlayState ()? functie create ()? PlayState._ship = Ship.new () buttonHandler (PlayState)? einde
Nu moeten we een lus maken om de gameplay aan te kunnen. In de originele code werd hiervoor de update () -functie gebruikt. We zullen hetzelfde doen met onze code. Net zoals we met de functie create () gedaan hebben, reageer met de update () -functie en zet opmerkingen van enkele regel vóór alle inside-lijnen.
functie update () -: void --FlxU.overlap (_aliens, _bullets, overlappingAlienBullet) --FlxU.overlap (_aliens, _ship, overlapAlienShip) --if (FlxG.keys.justPressed ("SPACE") en _ship.dead == false) then - spawnBullet (_ship.getBulletSpawnPosition ()) --end --if (FlxG.keys.ENTER en _ship.dead) then - FlxG.state = new PlayState (); --end --_ spawnTimer = _spawnTimer - FlxG.elapsed --if (_spawnTimer < 0) then -- spawnAlien() -- resetSpawnTimer() --end --super.update() end
Om de update () -functie herhaaldelijk genoemd te krijgen, zoals in flixel, moeten we een gebeurtenis toevoegen
luisteraar. Met deze coderegel wordt update () ingesteld voor elk nieuw frame. Voeg het toe in de create ()
functie.
function create () -: void? buttonHandler (PlayState) Runtime: addEventListener ("enterFrame", update)? einde
Laten we even kijken of het spel nog draait voordat we de loop van het spel laten gaan. Onthoud deze variabele
"PlayState._inGame"? We gaan het gebruiken om te controleren of het spel afgelopen is. Dus omring de commentaar update () code met deze verklaring.
function update () -: void if PlayState._inGame then? commentaarcode? einde
Om het schip te laten bewegen, moeten we de update () -functie van Ship.lua aan het werk krijgen. Zoals eerder, verander de opmerkingen zodat de functieverklaring niet langer wordt becommentarieerd, maar de rest is. Voeg dezelfde gebeurtenislistener toe net voor het einde van Ship ().
functie Ship ()? Runtime: addEventListener ("enterFrame", update) retourneer het einde van het schip
We moeten ook controleren of de variabele "Ship" bestaat en dat deze niet nul is. Verpak de opmerking
code met deze if-instructie.
functie-update () als Verzenden dan? commentaarcode? einde
Laten we beginnen met het doornemen van de commentaarregels. De eerste twee stellen de snelheid van het schip in op 0.
Corona heeft geen snelheid zoals Flixel, dus zullen we uiteindelijk werken met x en y van het schip
direct. De volgende acht regels controleren of de linker- of rechterpijltoetsen op het toetsenbord zijn gedrukt. Wij
kan dit vervangen door controles voor de variabelen _left en _right. Omdat we geen snelheid hebben om
werk met, we zullen gewoon de x-waarde van het schip instellen op plus of min 5.
if (Ship._left) en vervolgens Ship.x = Ship.x - 5 elseif (Ship._right) en vervolgens Ship.x = Ship.x + 5 end
Hetzelfde geldt voor op en neer.
if (Ship._up) en vervolgens Ship.y = Ship.y - 5 elseif (Ship._down) en vervolgens Ship.y = Ship.y + 5 end
U kunt "super.update ()" verwijderen
Als je nu het spel zou uitvoeren, zou het schip behoorlijk bewegen. Het probleem is, het zal vliegen
direct van het scherm of naar de knoppen als we het laten. De originele game had ook dit probleem. Zo,
de volgende coderegels in de update () -functie voorkomen dat het schip een grens verlaat. Het
volbrengt dit door te controleren of het schip buiten de grens ligt nadat al zijn x- en y-veranderingen hebben plaatsgevonden
zijn klaar. Als het schip buiten staat, wordt het teruggeschoven naar de maximaal toegestane waarde. We zullen hetzelfde doen en we kunnen dezelfde display.contentWidth en contentHeight gebruiken als bij de achtergrond om de schermgrootte te vinden.
if (Ship.x> display.contentWidth-Ship.contentWidth-16) en vervolgens 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) en vervolgens Ship.y = display.contentHeight-Ship.contentHeight-150 elseif (Ship.y < Ship.contentHeight+16) then Ship.y = Ship.contentHeight+16 end
Ik veranderde de cijfers een beetje zodat het schip de knoppen niet zou overlappen.
Nu moeten we ons schip laten schieten. Laten we eens kijken naar "de / pixelate / flixelprimer / Bullet.as". Gaan
via het normale syntaxisconversieproces. Gelukkig is deze heel gemakkelijk. Verwijder alles behalve de constructor Bullet (). Voeg de module-declaratie toe en sla deze op als Bullet.lua in uw projectmap.
We hebben nu een Bullet () -functie die een X- en een Y-waarde gebruikt. Daarmee creëert het een groene rechthoek
coördinaten en stelt de snelheid in op 1000.
Laten we de rechthoek die fungeert als de kogel op dezelfde manier maken als de achtergrond in de eerste
les.
module (?, package.seeall) functie Opsommingsteken (x, y) -: void local Bullet = display.newRect (x, y, 16, 4) - super (x, y) --createGraphic (16, 4, 0xFF597137) --velocity.x = 1000 einde
Deze code maakt een vierkant van 16 bij 4 pixels en stelt de X- en Y-coördinaten in op de nummers die aan Bullet (x, y) worden doorgegeven. Laten we nu de opvulkleur van de kogel wijzigen. # 587137 geconverteerd naar RGB is (89, 113, 55).
module (?, package.seeall) functie Bullet (x, y) -: void local Bullet = display.newRect (x, y, 16, 4) Bullet: setFillColor (89, 113, 55) --velocity.x = 1000 einde
Laten we een nieuwe () functie toevoegen voor het gemak, zoals we deden met Ship.lua.
module (?, package.seeall) functie Bullet (x, y) -: void local Bullet = display.newRect (x, y, 16, 4) Bullet: setFillColor (89, 113, 55) --velocity.x = 1000 return Bullet-eindfunctie nieuw (x, y) return Bullet (x, y) einde
Die code accepteert gewoon een X- en een Y-waarde en retourneert een nieuwe bullet op die locatie. Zorg ervoor dat
voeg "return Bullet" toe aan het einde van Bullet () zodat PlayState deze kan gebruiken.
Nu moeten we de snelheid opnieuw creëren. Laten we een update () -functie maken zoals we deden voor het schip.
? function Bullet (x, y) -: void local Bullet = display.newRect (x, y, 16, 4) Bullet: setFillColor (89, 113, 55) functie-update () als Bullet en Bullet.x = Bullet.x + 10 end-end Runtime: addEventListener ("enterFrame", update) retourneert Bullet-einde?
Nu zal de kogel elk beeld tien pixels naar rechts verschuiven.
Nu hebben we een methode nodig om de kogels af te vuren. Laten we nog een knop toevoegen. Ten eerste hebben we een variabele nodig om bij te houden of de knop is ingedrukt of niet. In plaats van dit in het Ship.lua-bestand af te handelen, kunnen we deze variabele maken in de functie create () in PlayState.lua onderaan in het bestand.
variabele declaraties.
? function create () -: void - variable declarations PlayState._inGame = true PlayState._background = nil PlayState._ship = nil - PlayState._aliens = nil - PlayState._ship = nil - PlayState._scoreText = nil - PlayState._gameOverText = nil - PlayState._spawnTimer = nil - PlayState._spawnInterval = 2.5 PlayState._shoot = nihil? einde?
Ga je gang en zet deze onder de nieuwe scheepsregel in de variabele toewijzingen op false.
? function create () -: void? - variabele toewijzingen PlayState._background = display.newRect (0, 0, display.contentWidth, display.contentHeight) PlayState._background: setFillColor (171, 204, 125) PlayState._ship = Ship.new () PlayState._shoot = false ? einde?
Nu moeten we een paar regels toevoegen aan onze buttonHandler () -functie. We hebben nog twee functies nodig om de nieuwe knop in te drukken en los te laten. Voeg deze twee functies toe na rightPressed () en
rightReleased ().
? functieknopHandler (PlayState)? function leftPressed () PlayState._ship._left = true end function leftReleased () PlayState._ship._left = valse eindfunctie rightPressed () PlayState._ship._right = true end function rightReleased () PlayState._ship._right = valse eindfunctie shootPressed () PlayState._shoot = true end function shootReleased () PlayState._shoot = false end? einde?
Laad nu de knop zoals eerder.
? functieknopHandler (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?
Onze knopcode wordt een beetje rommelig. Laten we alle buttonHandler () naar een nieuw bestand met de naam verplaatsen
Buttons.lua. Vergeet de module-decleratie niet.
Importeer de nieuwe Button-module bovenaan PlayStation. Terwijl we daar zijn, kunnen we Bullet ook importeren.
module (?, package.seeall) local Ship = require ("Ship") local Bullet = vereisen ("Bullet") local Buttons = require ("Buttons") functie PlayState ()?
Wijzig de regel buttonHandler () in create () om de functie van de module aan te roepen.
function create () -: void? PlayState._ship = Ship.new () PlayState._shoot = false Buttons.buttonHandler (PlayState)? einde
Nu moeten we een aantal van de bullet handling-functies opnieuw creëren. Laten we naar getBulletSpawnPosition () kijken
in Ship.lua.
--[[function getBulletSpawnPosition () -: FlxPoint local p = new FlxPoint (x + 36, y + 12) return p end -]]
De oorspronkelijke functie was een instantiemethode van het schip. Het retourneerde een X- en een Y-waarde om een nieuwe opsomming te maken. Omdat het een instantiemethode moet zijn, moeten we ervoor zorgen dat het werkt zoals het is. Laten we de Ship-variabele ervan maken.
function Ship: getBulletSpawnPosition () -: FlxPoint local p = new FlxPoint (x + 36, y + 12) return p einde
Omdat FlxPoint een type is exclusief voor Flixel, laten we in plaats daarvan een array retourneren.
function Schip: getBulletSpawnPosition () local p = x = Ship.x + 36, y = Ship.y + 2 return p end
Deze code voegt 36 toe aan de X-waarde van het schip en 2 (ik gebruikte 2 in plaats van 12 om de kogels aan te passen
positie voor Corona) op de Y-waarde van het schip. Deze worden opgeslagen in een associatieve array. Dat kunnen we nu
toegang tot elk nummer met p.x en p.y.
In de originele code bevatte een variabele in de PlayState met de naam _bullets alle bullet-instanties.
We kunnen hetzelfde doen met een displaygroep. Een weergavegroep in Corona houdt eenvoudigweg een heleboel weergave-objecten vast en geeft deze weer. Dit is handig om een groep van dezelfde soort bij te houden
voorwerp. Wanneer objecten worden toegevoegd aan weergavegroepen, worden ze weergegeven in de volgorde waarin ze worden weergegeven
groepen worden gemaakt. Als we bijvoorbeeld een hoop kogels en een groep buitenaardse wezens hebben en we willen dat alle buitenaardse wezens bovenaan staan, kunnen we een opsommingstekengroep maken en vervolgens een buitenaardse weergavegroep. Als we alle opsommingstekens en buitenaardse instanties aan hun groepen toevoegen, worden deze altijd in de juiste volgorde weergegeven. Dit gebeurt zelfs als bijvoorbeeld een kogel na een alien wordt gemaakt. Het buitenaardse wezen staat bovenaan omdat de weergavegroep de weergavevolgorde bestuurt.
Maak een commentaar van de regel "- PlayState._bullets = nil" in de functie create () in PlayState.lua.
function create () -: void - variable declarations 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 = nihil? einde
Maak _bullets een nieuwe weergavegroep in de variabele toewijzingen.
function create () -: void? PlayState._ship = Ship.new () PlayState._shoot = false PlayState._bullets = display.newGroup () Buttons.buttonHandler (PlayState)? einde
Kijk nu eens naar spawnBullet ().
--[[function spawnBullet (p) -: void local bullet = new Bullet (p.x, p.y) _bullets.add (bullet) FlxG.play (SoundBullet) einde -]]
Deze code komt eigenlijk vrij dicht in de buurt van wat we willen. Laat het er zo uitzien:
function spawnBullet (p) -: void local _bullet = Bullet.new (p.x, p.y) PlayState._bullets: insert (_bullet) PlayState._shoot = false --FlxG.play (SoundBullet) einde
Wanneer het opsommingsteken is gemaakt, moet _shoot worden teruggezet naar false. Op die manier moet de gebruiker tillen
hun vinger voordat ze opnieuw vuren.
Corona heeft een eenvoudige API voor het afspelen van korte geluidseffecten. Om het te gebruiken, moeten we .caf geluid gebruiken
bestanden. De geconverteerde versie van de originele MP3-geluidseffecten is hiervoor in de bron inbegrepen
zelfstudie.
Eerst moeten we variabelen maken om de geluiden vast te houden. Boven aan PlayState bevinden zich drie lijnen.
Verplaats ze naar de variabele declaraties in create ().
function create () -: void - variable declarations 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: Class - [Embed (source = "? /? /? /? /Assets/mp3/ExplosionAlien.mp3")] private var SoundExplosionAlien: Class - [Insluiten (source = "? /? /? /? / assets / mp3 / Bullet.mp3 ")] private var SoundBullet: Class? einde
We willen gewoon dat de namen hetzelfde zijn. Maak ze eigenschappen van PlayState en zet ze op nul.
Maak de laatste regel uncomment.
function create () -: void - variable declarations 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 = n PlayState.SoundBullet = nihil? einde
Nu zullen we de mediamodule gebruiken om een nieuw geluid te laden. Zet dit onderaan de opdrachten:
function create () -: void? PlayState._ship = Ship.new () PlayState._shoot = false PlayState._bullets = display.newGroup () PlayState.SoundBullet = media.newEventSound ("Bullet.caf") Buttons.buttonHandler (PlayState)? einde
Terug naar spawnBullet (). We kunnen de laatste regel vervangen om ons nieuwe geluid te spelen.
function spawnBullet (p) -: void local _bullet = Bullet.new (p.x, p.y) PlayState._bullets: insert (_bullet) PlayState._shoot = false media.playEventSound (PlayState.SoundBullet) einde
Nu hoeven we alleen onze update () -functie aan te passen om wat schietkogels te krijgen. Controleer of _shoot is
waar en als _ship bestaat. Als dit het geval is, roept u onze methode getBulletSpawnPosition () op voor ons schip
en spawnBullet () op die locatie.
functie update () als PlayState._inGame dan als PlayState._shoot == true en PlayState._ship dan local p = PlayState._ship: getBulletSpawnPosition () spawnBullet (p) end? einde
In Flixel werd de herinnering voor ons opgevangen. In Corona moeten we voorwerpen opruimen die we hebben
zijn klaar met. Laten we een kill () instantie toevoegen aan elke bullet om ons te helpen. kill () is het
functie die automatisch door flixel wordt aangeroepen als een object niet langer nodig is. Voeg dit toe aan Bullet.lua:
functie Bullet (x, y)? functie-update ()? eindfunctie Bullet: kill () Bullet.parent: verwijderen (Bullet) Bullet = nul einde? einde
Dit is de juiste manier om een object in Corona op te ruimen. Eerst hebben we alle koppelingen verwijderd door te verwijderen
het van de displaygroep. Vervolgens stellen we de variabele Bullet in op nul. Laten we hetzelfde doen voor Schip.
Voeg dit toe onder getBulletSpawnPosition () in Ship.lua:
function Schip: kill () Schip: removeSelf () Schip = nihil Runtime: removeEventListener ("enterFrame", update) einde
Merk op dat we stopten met de update van elk frame te worden genoemd (omdat het schip niet bestaat
meer).
Laten we, terug in Bullet.lua, elk frame toevoegen om te zien of het opsommingsteken zich buiten het scherm bevindt.
Momenteel blijft onze code kogels tekenen, zelfs als ze niet kunnen worden gezien. Dit is een verspilling van de beperkte middelen van het apparaat. Vervang update () hiermee:
functie-update () als Bullet then if (Bullet.x < display.contentWidth) then Bullet.x = Bullet.x + 10 else Bullet:kill() end end end
Nu zal de kogel alleen naar rechts bewegen als hij kan worden gezien. Anders zal het ons handig bellen
kill () functie.
Lua heeft een automatische garbagecollector die puin als ongebruikte variabelen behandelt, objecten weergeeft die van het scherm zijn verwijderd en al het andere dat niet langer nodig is. We kunnen Lua vertellen om afval te verzamelen door deze regel toe te voegen aan het einde van het maken in onze PlayState:
functie create ()? collectgarbage ("collect") einde
Dit begint nu als een spel te lijken. Ons schip kan op het scherm rondlopen en kogels afvuren. De
kogels zorgen voor zichzelf wanneer ze niet langer nodig zijn. Nu hebben we gewoon wat vijanden nodig.