Maak een Brick Breaker-game met de Corona SDK Collision Detection

Welkom bij de laatste zelfstudie in onze Brick Breaker-gameserie! In deze zelfstudie behandelen we de logica voor de resterende botsingen, controleren op win- en verliesstatussen, wijzigingsniveaus en meer.


Waar we gebleven zijn?

Lees zeker deel 1 en deel 2 van deze serie om de code in deze tutorial volledig te begrijpen.

Stap 35: Detecteer Brick Collisions

Wanneer de bal botst met een steen, zullen we dezelfde techniek gebruiken als toegepast op de peddel om de kant te bepalen die de bal zal volgen:

 functie removeBrick (e) - Controleer welke kant van de steen de bal raakt, links, rechts if (e.other.name == 'brick' en (ball.x + ball.width * 0.5) < (e.other.x + e.other.width * 0.5)) then xSpeed = -5 elseif(e.other.name == 'brick' and (ball.x + ball.width * 0.5) >= (e.other.x + e.other.width * 0.5)) then xSpeed ​​= 5 end end

Stap 37: Verwijder Brick

Wanneer een steen wordt geraakt, gebruiken we de andere parameter van de botsing evenement om erachter te komen welke baksteen is geraakt en verwijder deze vervolgens uit zowel het podium als de stenengroep:

 -- Bounce, Remove if (e.other.name == 'brick') en vervolgens ySpeed ​​= ySpeed ​​* -1 e.other: removeSelf () e.other = nil bricks.numChildren = bricks.numChildren - 1

Stap 38: Score toevoegen

Elke baksteenhit voegt 100 punten toe aan de score. De score wordt uit de scoreconstante gehaald en als tekst aan de huidige score toegevoegd.

 score = score + 1
score Num.text = score * SCORE_CONST
scoreNum: setReferencePoint (display.CenterLeftReferencePoint)
score Num.x = 54
einde

Stap 39: Controleer stenen

Deze code controleert of er nog stenen over zijn op het podium en geeft een bericht "you won" weer als dit niet het geval is:

 if (bricks.numChildren < 0) then alert(' You Win!', ' Next Level ?') gameEvent = 'win' end end

Stap 40: Balverplaatsing

De balsnelheid wordt bepaald door de xSpeed en ySpeed variabelen. Wanneer de bijwerken functie wordt uitgevoerd, begint de bal te bewegen met behulp van deze waarden voor plaatsing op elk frame.

 functie-update (e) - Balverplaatsing ball.x = bal.x + xSpeed ​​ball.y = bal.y + ySpeed

Stap 41: Muurbotsing

Deze code controleert op muurbotsingen met de bal en reageert door de bal in de tegenovergestelde richting te sturen wanneer nodig:

 if (ball.x < 0) then ball.x = ball.x + 3 xSpeed = -xSpeed end--Left if((ball.x + ball.width) > display.contentWidth) dan ball.x = ball.x - 3 xSpeed ​​= -xSpeed ​​end - Right if (ball.y < 0) then ySpeed = -ySpeed end--Up

Stap 42: conditie van het verlies

Een if-statement wordt gebruikt om te controleren of de peddel de bal mist. Als dit waar is, wordt een waarschuwing weergegeven waarin de gebruiker wordt gevraagd of ze het opnieuw willen proberen.

 if (ball.y + ball.height> paddle.y + paddle.height) en vervolgens alert ('You Lose', 'Play Again?') gameEvent = 'lose' end-down / lose

Stap 43: Spelstatusbericht

Het waarschuwingsscherm toont de spelerinformatie over de status van het spel. Het wordt getoond wanneer een win / verlies-evenement wordt bereikt.

Twee parameters worden gebruikt in deze functie:

  • t: De meldingstitel
  • m: Een kort bericht
 functie waarschuwing (t, m) gameListeners ('remove') alertBg = display.newImage ('alertBg.png') box = display.newImage ('alertBox.png', 90, 202) transition.from (box, time = 300, xScale = 0,5, yScale = 0,5, transition = easing.outExpo) titleTF = display.newText (t, 0, 0, 'akashi', 19) titleTF: setTextColor (254,203,50) titleTF: setReferencePoint (display.CenterReferencePoint ) titleTF.x = display.contentCenterX titleTF.y = display.contentCenterY - 15 msgTF = display.newText (m, 0, 0, 'akashi', 12) msgTF: setTextColor (254,203,50) msgTF: setReferencePoint (display.CenterReferencePoint ) msgTF.x = display.contentCenterX msgTF.y = display.contentCenterY + 15 box: addEventListener ('tik op', herstart) alertScreen = display.newGroup () alertScreen: insert (alertBg) alertScreen: insert (box) alertScreen: insert ( titleTF) alertScreen: insert (msgTF) einde

Stap 44: start opnieuw op

De volgende functie controleert de spelstatus (winnen, verliezen, afgewerkt) en voert de bijbehorende actie uit:

 functie opnieuw opstarten (e) if (gameEvent == 'win' en table.maxn (niveaus)> currentLevel) dan currentLevel = currentLevel + 1 changeLevel (levels [currentLevel]) - next level levelNum.text = tostring (currentLevel) elseif ( gameEvent == 'win' en table.maxn (niveaus) <= currentLevel) then box:removeEventListener('tap', restart) alertScreen:removeSelf() alertScreen = nil alert(' Game Over', ' Congratulations!') gameEvent = 'finished' elseif(gameEvent == 'lose') then changeLevel(levels[currentLevel])--same level elseif(gameEvent == 'finished') then addMenuScreen() transition.from(menuScreen, time = 300, y = -menuScreen.height, transition = easing.outExpo) box:removeEventListener('tap', restart) alertScreen:removeSelf() alertScreen = nil currentLevel = scoreText:removeSelf() scoreText = nil scoreNum:removeSelf() scoreNum = nil levelText:removeSelf() levelText = nil levelNum:removeSelf() levelNum = nil ball:removeSelf() ball = nil paddle:removeSelf() paddle = nil score = 0 end end

Stap 45: Verander niveau

Deze functie verandert het niveau wanneer nodig:

 function changeLevel (level) - Clear Level Bricks bricks: removeSelf () bricks.numChildren = 0 bricks = display.newGroup () - Remove Alert box: removeEventListener ('tap', restart) alertScreen: removeSelf () alertScreen = nil - - Reset Bal en Paddle positie ball.x = (display.contentWidth * 0.5) - (ball.width * 0.5) ball.y = (paddle.y - paddle.height) - (ball.height * 0.5) -2 paddle. x = display.contentWidth * 0.5 - Redraw Bricks buildLevel (level) - Start background: addEventListener ('tap', startGame) end

Stap 46: Hoofdfunctie oproepen

Om het spel in eerste instantie te starten, is de Hoofd functie moet worden gebeld. Met de bovenstaande code op zijn plaats, doen we dat hier:

 Hoofd()

Stap 47: Maak het laadscherm aan

Het bestand Default.png is een afbeelding die juist wordt weergegeven wanneer u de toepassing start terwijl de iOS de basisgegevens laadt om het hoofdscherm weer te geven. Voeg deze afbeelding toe aan uw projectbronmap en deze wordt automatisch toegevoegd door de Corona-compileermachine.


Stap 48: Icoon

Met behulp van de afbeeldingen die u eerder hebt gemaakt, kunt u nu een mooi en goed uitziend pictogram maken. De pictogramgrootte voor het niet-retina-iPhone-pictogram is 57x57px, maar de netvliesversie is 114x114px en de iTunes-winkel heeft een 512x512px-versie nodig. Ik stel voor eerst de 512x512-versie te maken en vervolgens de overige formaten te verkleinen.

Het hoeft niet de afgeronde hoeken of de transparante schittering te hebben, iTunes en de iPhone zullen dat voor je doen.


Stap 49: Testen in de simulator

Het is tijd om de laatste test te doen. Open de Corona Simulator, blader naar uw projectmap en klik vervolgens op Openen. Als alles werkt zoals verwacht, bent u klaar voor de laatste stap!


Stap 50: Bouw

Ga in de Corona Simulator naar Bestand> Build en selecteer uw doelapparaat. Vul de vereiste gegevens in en klik op bouwen. Wacht een paar seconden en uw app is gereed voor apparaattesten en / of verzending voor distributie!


Conclusie

Het eindresultaat is een aanpasbaar en vermakelijk spel. Probeer uw eigen aangepaste afbeeldingen en niveaus toe te voegen om dingen op te fleuren!

Ik hoop dat je deze tutorialserie leuk vond en het nuttig vond. Bedankt voor het lezen!