Dit is de tweede aflevering in onze Corona SDK Rapid Roll Game-zelfstudie. In de tutorial van vandaag zullen we toevoegen aan onze interface en beginnen met het coderen van de game-interactie. Lees verder!
Controleer alsjeblieft deel 1 van de serie om deze tutorial volledig te begrijpen en voor te bereiden.
Verklaar alle functies als lokaal aan het begin.
local Main = local startButtonListeners = local showCredits = local hideCredits = local showGameView = local placeBet = local randomShellMove = local checkMovesLeft = local revealBall = local alert =
Vervolgens maken we de functie waarmee alle spellogica wordt geïnitialiseerd:
functie Main () addTitleView () end
Nu plaatsen we TitleView in de fase en roepen we een functie aan die de tik luisteraars naar de knoppen.
function addTitleView () bg = display.newImage ('bg.png') title = display.newImage ('titleBg.png') startB = display.newImage ('startBtn.png') startB.x = display.contentCenterX startB.y = display.contentCenterY startB.name = 'startB' creditsB = display.newImage ('creditsBtn.png') creditsB.x = display.contentCenterX creditsB.y = display.contentCenterY + 60 creditsB.name = 'creditsB' titleView = display. newGroup () titleView: insert (title) titleView: insert (startB) titleView: insert (creditsB) initialListeners ('add') einde
Deze functie voegt de benodigde luisteraars toe aan de TitleView toetsen.
function initialListeners (action) if (action == 'add') then startB: addEventListener ('tap', gameView) creditsB: addEventListener ('tap', showCredits) else startB: removeEventListener ('tap', gameView) creditsB: removeEventListener ( 'tik', showCredits) einde
Het aftitelingscherm wordt getoond wanneer de gebruiker op de aftitelingknop tikt, a tik luisteraar is toegevoegd aan de weergave credits om deze te verwijderen.
function showCredits () credits = display.newImage ('creditsView.png') transition.from (credits, time = 400, x = display.contentWidth * 2, transition = easing.outExpo) credits: addEventListener ('tik op', hideCredits) startB.isVisible = false creditsB.isVisible = false end
Wanneer het creditsscherm wordt aangebroken, wordt het uit het werkgebied geschud en verwijderd.
function hideCredits () startB.isVisible = true creditsB.isVisible = true transition.to (credits, time = 600, x = display.contentWidth * 2, transition = easing.outExpo, onComplete = destroyCredits) end function destroyCredits () credits : removeEventListener ('tap', hideCredits) display.remove (credits) credits = nul einde
Wanneer de Begin op de knop is getikt, de titelweergave is getweend en verwijderd waardoor de gameweergave wordt onthuld.
function gameView () initialListeners ('rmv') - Verwijder MenuView, Start Game transition.to (titleView, time = 500, y = -titleView.height, onComplete = function () display.remove (titleView) titleView = nil addInitialBlocks (3) end)
Deze code maakt de tekst Score en levens en plaatst deze in het werkgebied.
-- Score Tekst scoreTF = display.newText ('0', 303, 22, system.nativeFont, 12) scoreTF: setTextColor (68, 68, 68) - Lives Text livesTF = display.newText ('x3', 289, 56, system.nativeFont, 12) livesTF: setTextColor (245, 249, 248) einde
De volgende functie voegt de blokken die in de parameter zijn gespecificeerd op een willekeurige positie toe, het zal ook de functie aanroepen om de speler aan het podium toe te voegen.
functie addInitialBlocks (n) blocks = display.newGroup () voor i = 1, n do local block = display.newImage ('block.png') block.x = math.floor (math.random () * (display.contentWidth - block.width)) block.y = (display.contentHeight * 0.5) + math.floor (math.random () * (display.contentHeight * 0.5)) physics.addBody (block, density = 1, bounce = 0 ) block.bodyType = 'static' blocks: insert (blok) end addPlayer () end
De speler wordt toegevoegd als de eerste blokken in fase zijn. Het verschijnt in het midden X van het podium.
function addPlayer () player = display.newImage ('player.png') player.x = (display.contentWidth * 0.5) player.y = player.height physics.addBody (speler, density = 1, friction = 0, bounce = 0) player.isFixedRotation = true gameListeners ('add') end
De accelerometer wordt gebruikt om de speler over het scherm te verplaatsen, de waarde wordt berekend met behulp van de xGravity eigendom.
function movePlayer: accelerometer (e) - Accelerometer Movement player.x = display.contentCenterX + (display.contentCenterX * (e.xGravity * 3))
Deze code voorkomt dat de speler opzij van het scherm verdwijnt.
-- Grenzen indien ((player.x - player.width * 0.5) < 0) then player.x = player.width * 0.5 elseif((player.x + player.width * 0.5) > display.contentWidth) en player.x = display.contentWidth - player.width * 0.5 end end
Deze functie wordt aangeroepen door een timer. Het berekent een willekeurig getal tussen 1 en 4 en wanneer het resultaat gelijk is aan 1, wordt een slecht blok toegevoegd. Als het resultaat anders is dan 1, wordt een normaal blok geïnstantieerd. De blokken worden toegevoegd aan een tabel, op deze manier hebben we toegang tot deze buiten deze functie.
functie addBlock () local r = math.floor (math.random () * 4) if (r ~ = 0) en local block = display.newImage ('block.png') block.x = math.random () * (display.contentWidth - (block.width * 0.5)) block.y = display.contentHeight + block.height physics.addBody (block, density = 1, bounce = 0) block.bodyType = 'static' blocks: insert (block) else local badBlock = display.newImage ('badBlock.png') badBlock.name = 'bad' physics.addBody (badBlock, density = 1, bounce = 0) badBlock.bodyType = 'static' badBlock.x = math.random () * (display.contentWidth - (badBlock.width * 0.5)) badBlock.y = display.contentHeight + badBlock.height blocks: insert (badBlock) end end
Een andere tijdfunctie, een live-afbeelding wordt toegevoegd wanneer de timer voltooid is. De live positie is het laatste blok in de tabel - 1.
function addLive () live = display.newImage ('live.png') live.name = 'live' live.x = blokken [blocks.numChildren - 1] .x live.y = blocks [blocks.numChildren - 1]. y - live.height physics.addBody (live, density = 1, friction = 0, bounce = 0) end
Met deze functie worden de benodigde luisteraars toegevoegd en verwijderd om het spel te starten.
functie gameListeners (actie) if (action == 'add') dan Runtime: addEventListener ('accelerometer', movePlayer) Runtime: addEventListener ('enterFrame', update) blockTimer = timer.performWithDelay (800, addBlock, 0) liveTimer = timer .performWithDelay (8000, addLive, 0) speler: addEventListener ('collision', collisionHandler) else Runtime: removeEventListener ('accelerometer', movePlayer) Runtime: removeEventListener ('enterFrame', update) timer.cancel (blockTimer) timer.cancel ( liveTimer) blockTimer = nil liveTimer = nil player: removeEventListener ('collision', collisionHandler) end end
Hier is de volledige code die in deze zelfstudie is geschreven, samen met opmerkingen om u te helpen bij het identificeren van elk onderdeel:
-- Blocks 'Rapid Roll' zoals Game - Ontwikkeld door Carlos Yanez - Hide Status Bar display.setStatusBar (display.HiddenStatusBar) - Physics local physics = require ('physics') physics.start () physics.setGravity (0, 0 ) - Graphics - [Background] local bg - [Title View] lokale titel local startB local creditsB - [TitleView Group] lokale titelView - [CreditsView] local credits - [Score & levens] local live local livesTF local lives = 3 lokale scoreTF lokale score = 0 lokale alertScore - [Blokken groep, speler] lokale blokken lokale speler - [GameView Group] lokale gameView - variabelen lokale moveSpeed = 2 lokale blockTimer lokale liveTimer - lokale functies Main = local addTitleView = local initialListeners = local showCredits = local hideCredits = local destroyCredits = local gameView = local addInitialBlocks = local addPlayer = local movePlayer = local addBlock = local addLive = local gameListeners = local update = local collisionHandler = local showAlert = functie Main () addTitleView () eindfunctie addTitleView () bg = display.newImage ('bg.png') title = display.newImage ('titleBg.png') startB = display.newImage ('startBtn.png' ) startB.x = display.contentCenterX startB.y = display.contentCenterY startB.name = 'startB' creditsB = display.newImage ('creditsBtn.png') creditsB.x = display.contentCenterX creditsB.y = display.contentCenterY + 60 creditsB.name = 'creditsB' titleView = display.newGroup () titleView: insert (title) titleView: insert (startB) titleView: insert (creditsB) initialListeners ('add') end function initialListeners (action) if (action == ' add ') en startB: addEventListener (' tap ', gameView) creditsB: addEventListener (' tap ', showCredits) else startB: removeEventListener (' tap ', gameView) creditsB: removeEventListener (' tap ', showCredits) end end function showCredits ( ) credits = display.newImage ('creditsView.png') transition.from (credits, time = 400, x = display.contentWidth * 2, transition = easing.outExpo) credits: addEventListener (' tik op ', hideCredits) startB.isVisible = false creditsB.isVisible = false end function hideCredits () startB.isVisible = true creditsB.isVisible = true transition.to (credits, time = 600, x = display.contentWidth * 2, transition = easing.outExpo, onComplete = destroyCredits) einde functie destroyCredits () credits: removeEventListener ('tap', hideCredits) display.remove (credits) credits = nul einde functie gameView () initialListeners ('rmv') - Verwijder MenuView, Start Game transition.to (titleView, time = 500, y = -titleView.height, onComplete = function () display.remove (titleView) titleView = nil addInitialBlocks (3) end) - Score Tekst scoreTF = display.newText ('0', 303, 22, system.nativeFont, 12) score TF: setTextColor (68, 68, 68) - Lives Text livesTF = display.newText ('x3', 289, 56, system.nativeFont, 12) livesTF : setTextColor (245, 249, 248) eindfunctie addInitialBlocks (n) blocks = display.newGroup () voor i = 1, n do local block = display.newImage ('block.png') block.x = math.floor ( math.random () * (display.contentWidth - block.width)) block.y = (display.contentHeight * 0.5) + math.floor (math.random () * (display.contentHeight * 0.5)) physics.addBody (block, density = 1 , bounce = 0) block.bodyType = 'static' blocks: insert (blok) einde addPlayer () eindfunctie addPlayer () player = display.newImage ('player.png') player.x = (display.contentWidth * 0.5 ) player.y = player.height physics.addBody (speler, density = 1, friction = 0, bounce = 0) player.isFixedRotation = true gameListeners ('add') eindfunctie movePlayer: accelerometer (e) - Accelerometer Movement player.x = display.contentCenterX + (display.contentCenterX * (e.xGravity * 3)) - Randen als ((player.x - player.width * 0.5) < 0) then player.x = player.width * 0.5 elseif((player.x + player.width * 0.5) > display.contentWidth) en player.x = display.contentWidth - player.width * 0.5 end-end-functie addBlock () local r = math.floor (math.random () * 4) if (r ~ = 0) en lokaal blok = display.newImage ('block.png') block.x = math.random () * (display.contentWidth - (block.width * 0.5)) block.y = display.contentHeight + block.height physics.addBody (block, density = 1, bounce = 0) block.bodyType = 'static' blocks: insert (block) else local badBlock = display.newImage ('badBlock.png') badBlock.name = 'bad' physics.addBody (badBlock, density = 1, bounce = 0) badBlock.bodyType = 'static' badBlock.x = math.random () * (display.contentWidth - (badBlock.width * 0.5)) badBlock.y = display.contentHeight + badBlock. height blocks: insert (badBlock) end end-functie addLive () live = display.newImage ('live.png') live.name = 'live' live.x = blocks [blocks.numChildren - 1] .x live.y = blokken [blocks.numChildren - 1] .y - live.height physics.addBody (live, density = 1, friction = 0, bounce = 0) einde functie gameList eners (actie) if (action == 'add') dan Runtime: addEventListener ('accelerometer', movePlayer) Runtime: addEventListener ('enterFrame', update) blockTimer = timer.performWithDelay (800, addBlock, 0) liveTimer = timer. performWithDelay (8000, addLive, 0) player: addEventListener ('collision', collisionHandler) else Runtime: removeEventListener ('accelerometer', movePlayer) Runtime: removeEventListener ('enterFrame', update) timer.cancel (blockTimer) timer.cancel (liveTimer ) blockTimer = nil liveTimer = nil player: removeEventListener ('collision', collisionHandler) end end
In het volgende en laatste deel van de serie behandelen we de blokken en bewegingen van spelers, botsingen en de laatste stappen die moeten worden genomen voorafgaand aan de release, zoals app-testen, het maken van een startscherm, het toevoegen van een pictogram en, ten slotte, het bouwen van de app . Blijf op de hoogte voor het laatste deel!