In questa serie di tutorial, creeremo ex novo un gioco Brick Breaker utilizzando Corona SDK. L'obiettivo di questo gioco è di controllare una pagaia simile a un pong per colpire una palla contro una pila di mattoni fino a quando non si rompono tutti.
Se non lo hai già fatto, assicurati di leggere parte 1 di questa serie per comprendere appieno il codice in questo tutorial.
Dopo aver dichiarato una tabella multidimensionale per mantenere i nostri livelli nel passaggio 15, ora dichiara tutte le funzioni che verranno utilizzate in questa app:
addMenuScreen locale = tweenMS locale = localAbout hide local rmvAbout = local addGameScreen = local buildLevel = local movePaddle = local gameListeners = local startGame = update locale = bounce locale = local removeBrick = alert locale = local restart = local changeLevel =
Ora crea Principale()
, la prima funzione che verrà chiamata all'avvio del nostro gioco:
funzione locale Main () addMenuScreen () end
Il prossimo snippet di codice aggiunge la grafica dello schermo del menu allo stage e li memorizza nel schermata MENU gruppo:
function addMenuScreen () menuScreen = display.newGroup () mScreen = display.newImage ('mScreen.png') startB = display.newImage ('startB.png') startB.name = 'startB' aboutB = display.newImage ('aboutB .png ') aboutB.name =' aboutB 'menuScreen: insert (mScreen) startB.x = 160 startB.y = 260 menuScreen: insert (startB) aboutB.x = 160 aboutB.y = 310 menuScreen: insert (aboutB)
Gli ascoltatori vengono aggiunti ai pulsanti per eseguire il tweenMS funzione quando toccato:
startB: addEventListener ('tap', tweenMS) aboutB: addEventListener ('tap', tweenMS) end
Questa funzione controlla quale pulsante è stato toccato e visualizza la vista corrispondente:
function tweenMS: tocca (e) if (e.target.name == 'startB') quindi - Avvia la transizione di gioco.to (menuScreen, time = 300, y = -menuScreen.height, transition = easing.outExpo, onComplete = addGameScreen) - Call AboutScreen aboutScreen = display.newImage ('aboutScreen.png') transition.from (aboutScreen, time = 300, x = menuScreen.contentWidth, transition = easing.outExpo) aboutScreen: addEventListener (' tocca ', nascondiInformazioni)
Queste linee, la conclusione del tweenMS
funzione dall'alto, nascondi i pulsanti della schermata del menu per evitare i tocchi indesiderati:
startB.isVisible = false; aboutB.isVisible = false; fine fine
La prossima funzione interpola lo schermo e lo rimuove:
function hideAbout: tap (e) transition.to (aboutScreen, time = 300, x = aboutScreen.width * 2, transition = easing.outExpo, onComplete = rmvAbout) end function rmvAbout () aboutScreen: removeSelf () - Abilita Menu Pulsanti startB.isVisible = true; aboutB.isVisible = true; fine
Quando l'utente tocca il pulsante di avvio, iniziamo la creazione della schermata di gioco. La prima cosa da fare è distruggere la schermata del menu:
function addGameScreen () - Destroy Menu Screen menuScreen: removeSelf () menuScreen = nil
Successivamente aggiungiamo la grafica di paddle e ball:
-- Aggiungi schermata di gioco paddle = display.newImage ('paddle.png') ball = display.newImage ('ball.png') paddle.x = 160 paddle.y = 460 ball.x = 160 ball.y = 446 paddle.name = 'paddle' ball.name = 'palla'
Quindi costruiamo il livello. Questa funzione è completamente spiegata più avanti nel tut:
buildLevel (livelli [1])
L'ultima grafica da aggiungere riguarda il testo dei punteggi e dei livelli:
scoreText = display.newText ('Score:', 5, 2, 'akashi', 14) scoreText: setTextColor (254, 203, 50) scoreNum = display.newText ('0', 54, 2, 'akashi', 14 ) scoreNum: setTextColor (254,203,50) levelText = display.newText ('Level:', 260, 2, 'akashi', 14) levelText: setTextColor (254, 203, 50) levelNum = display.newText ('1', 307, 2, 'akashi', 14) levelNum: setTextColor (254,203,50)
Un ascoltatore viene aggiunto allo sfondo. Questo ascoltatore inizierà il gioco quando viene toccato lo sfondo:
background: addEventListener ('tap', startGame) end
La paletta sarà controllata usando l'accelerometro del dispositivo. I dati saranno ottenuti utilizzando e.xGravity e passati alla proprietà x della pagaia.
function movePaddle: accelerometer (e) - Accelerometer Movement paddle.x = display.contentCenterX + (display.contentCenterX * (e.xGravity * 3))
Per impedire che la paletta lasci il palco, creiamo bordi invisibili ai lati dello schermo:
if ((paddle.x - paddle.width * 0.5) < 0) then paddle.x = paddle.width * 0.5 elseif((paddle.x + paddle.width * 0.5) > display.contentWidth) quindi paddle.x = display.contentWidth - paddle.width * 0.5 end end
I livelli saranno creati da questa funzione.
Usa un parametro per ottenere il livello da costruire, calcola le sue dimensioni ed esegue un ciclo doppio per ciclo, uno per l'altezza e uno per la larghezza. Successivamente, crea una nuova istanza Brick che viene posizionata in base alla sua larghezza, altezza e il numero corrispondente a io e j. Il mattone è dichiarato come statico nel motore fisico in quanto non rileverà la collisione, che sarà gestita dal palla che è l'unico dinamico tipo di fisica.
Infine, il mattone viene aggiunto al gruppo di mattoni per accedervi al di fuori di questa funzione.
function buildLevel (level) - Lunghezza del livello, altezza locale len = table.maxn (livello) brick: toFront () per i = 1, len do per j = 1, W_LEN do if (level [i] [j] == 1) then brick = display.newImage ('brick.png') brick.name = 'brick' brick.x = BRICK_W * j - OFFSET brick.y = BRICK_H * i physics.addBody (brick, density = 1, friction = 0, bounce = 0) brick.bodyType = "static" bricks.insert (brick, brick) end end end end
Questa funzione aggiunge o rimuove gli ascoltatori. Usa un parametro per determinare se gli ascoltatori dovrebbero essere aggiunti o rimossi. Si noti che alcune linee sono commentate poiché le funzioni per gestirle non sono state ancora create.
function gameListeners (action) if (action == 'add') then Runtime: addEventListener ('accelerometer', movePaddle) --Runtime: addEventListener ('enterFrame', update) paddle: addEventListener ('collision', bounce) --ball : addEventListener ('collision', removeBrick) else Runtime: removeEventListener ('accelerometer', movePaddle) --Runtime: removeEventListener ('enterFrame', update) paddle: removeEventListener ('collision', bounce) --ball: removeEventListener ('collision ', removeBrick) end end
In questa funzione chiamiamo il gameListeners funzione che avvierà il movimento e i controlli del gioco:
function startGame: tap (e) background: removeEventListener ('tap', startGame) gameListeners ('add') - Physics physics.addBody (paddle, density = 1, friction = 0, bounce = 0) physics.addBody ( palla, densità = 1, attrito = 0, rimbalzo = 0) paddle.bodyType = fine "statico"
Quando la palla colpisce la paletta, il yspeed
è impostato su negativo per far salire la pallina. Controlliamo anche in quale lato della paletta la palla ha colpito per scegliere il lato dove si muoverà in seguito. La collisione viene rilevata dal collisione ascoltatore di eventi aggiunto nel gameListeners
funzione:
funzione rimbalzo (e) ySpeed = -5 - Collisione paletta, controlla su quale lato della paletta colpisce la palla, a sinistra, a destra se ((palla.x + sfera.pertura * 0.5) < paddle.x) then xSpeed = -5 elseif((ball.x + ball.width * 0.5) >= paddle.x) quindi xSpeed = 5 end end - Esegui il codice Main ()
Nella parte successiva e finale della serie, gestiremo collisioni di mattoni e muri, punteggi, livelli e le fasi finali da eseguire prima del rilascio, come test delle app, creazione di una schermata iniziale, aggiunta di un'icona e, infine, creazione del app. Restate sintonizzati per la parte finale!