Dans cette série de didacticiels, nous allons créer un jeu Brick Breaker à partir de zéro en utilisant le SDK Corona. Le but de ce jeu est de contrôler une raquette en forme de pong pour frapper une balle contre une pile de briques jusqu'à ce qu'elles se cassent.
Si vous ne l'avez pas déjà fait, assurez-vous de lire partie 1 de cette série pour bien comprendre le code de ce tutoriel.
Après avoir déclaré une table multidimensionnelle pour contenir nos niveaux à l'étape 15, déclarez maintenant toutes les fonctions qui seront utilisées dans cette application:
local addMenuScreen = local tweenMS = local hideAbout = local rmvAbout = local addGameScreen = local buildLevel = local movePaddle = local gameListeners = startGame local = mise à jour locale = rebond local = local removeBrick = alerte local = redémarrage local = localLevel = =
Maintenant créer Principale()
, la première fonction qui sera appelée quand notre jeu commencera:
fonction locale Main () addMenuScreen () end
L'extrait de code suivant ajoute les graphiques de l'écran de menu à la scène et les stocke dans la menuScreen groupe:
fonction 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)
Les auditeurs sont ajoutés aux boutons pour effectuer la tweenMS fonction lorsque vous appuyez sur:
startB: addEventListener ('tap', tweenMS) aboutB: addEventListener ('tap', tweenMS) fin
Cette fonction vérifie quel bouton a été tapé et affiche la vue correspondante:
fonction tweenMS: tapez sur (e) si (e.target.name == 'startB') puis - Démarrer le jeu. transition.to (menuScreen, heure = 300, y = -menuScreen.height, transition = easing.outExpo, onComplete = addGameScreen) else - Appelez AboutScreen aboutScreen = display.newImage ('aboutScreen.png') transition.from (aboutScreen, heure = 300, x = menuScreen.contentWidth, transition = easing.outExpo) aboutScreen: addEventListener (' appuyez sur ', masquerAbout)
Ces lignes, la conclusion de la tweenMS
fonction d'en haut, masquez les boutons de l'écran du menu pour éviter les tapotements indésirables:
startB.isVisible = false; aboutB.isVisible = false; fin fin
La fonction suivante interpelle l’écran à propos de la scène et la supprime:
function hideAbout: tap (e) transition.to (aboutScreen, heure = 300, x = aboutScreen.width * 2, transition = easing.outExpo, onComplete = rmvAbout) fin de la fonction rmvAbout () aboutScreen: removeSelf () - Enable Boutons de menu startB.isVisible = true; aboutB.isVisible = true; fin
Lorsque l'utilisateur appuie sur le bouton de démarrage, nous commençons la création de l'écran du jeu. La première chose à faire est de détruire l’écran de menu:
function addGameScreen () - Détruit le menu de l'écran menuScreen: removeSelf () menuScreen = nil
Ensuite, nous ajoutons les graphiques de la palette et de la balle:
-- Ajouter écran de jeu 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 = 'ball'
Ensuite, nous construisons le niveau. Cette fonction est entièrement expliquée plus tard dans le tutoriel:
buildLevel (niveaux [1])
Les derniers graphiques à ajouter concernent le texte de la partition et des niveaux:
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 auditeur est ajouté à l'arrière-plan. Cet auditeur commencera le jeu lorsque le fond sera exploité:
arrière-plan: addEventListener ('tap', startGame) fin
La pagaie sera contrôlée à l'aide de l'accéléromètre de l'appareil. Les données seront obtenues à l'aide de e.xGravity et transmises à la propriété x de la palette..
function movePaddle: accelerometer (e) - Accéléromètre Movement paddle.x = display.contentCenterX + (display.contentCenterX * (e.xGravity * 3))
Pour empêcher la palette de quitter la scène, nous créons des bordures invisibles sur les côtés de l'écran:
if ((paddle.x - paddle.width * 0.5) < 0) then paddle.x = paddle.width * 0.5 elseif((paddle.x + paddle.width * 0.5) > display.contentWidth) puis paddle.x = display.contentWidth - paddle.width * 0.5 end end
Les niveaux seront construits par cette fonction.
Il utilise un paramètre pour obtenir le niveau à construire, calcule sa taille et exécute une double boucle for, une pour la hauteur et une pour la largeur. Ensuite, il crée une nouvelle instance de brique placée en fonction de sa largeur, de sa hauteur et du nombre correspondant à je et j. La brique est déclarée comme statique dans le moteur physique car il ne détectera pas la collision, il sera géré par le ballon qui est le seul dynamique type de physique.
Enfin, la brique est ajoutée au groupe de briques pour y accéder en dehors de cette fonction..
function buildLevel (niveau) - Niveau niveau, hauteur local len = table.maxn (niveau) briques: toFront () pour i = 1, len faire pour j = 1, W_LEN faire si (niveau [i] [j] == 1) puis local brick = display.newImage ('brick.png') brick.name = 'brick' brick.x = BRICK_W * j - OFFSET brick.y = BRICK_H * i physics.addBody (brique, densité = 1, friction = 0, bounce = 0) brick.bodyType = 'statique' bricks.insert (briques, briques) fin fin fin fin
Cette fonction ajoute ou supprime les auditeurs. Il utilise un paramètre pour déterminer si les écouteurs doivent être ajoutés ou supprimés. Notez que certaines lignes sont commentées car les fonctions pour les gérer n’ont pas encore été créées..
fonction gameListeners (action) if (action == 'add') puis 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) fin fin
Dans cette fonction, nous appelons le gameListeners fonction qui va démarrer le mouvement et les contrôles du jeu:
function startGame: tap (e) arrière-plan: removeEventListener ('tap', startGame) gameListeners ('add') - Physique physics.addBody (paddle, densité = 1, friction = 0, bounce = 0) physics.addBody ( balle, densité = 1, friction = 0, rebond = 0) paddle.bodyType = fin 'statique'
Quand la balle frappe la pagaie, le ySpeed
est réglé sur négatif pour que la balle monte. Nous vérifions également de quel côté de la raquette la balle a frappé pour choisir le côté où elle se déplacera ensuite. La collision est détectée par le collision écouteur d'événement ajoutée dans le gameListeners
une fonction:
fonction bounce (e) ySpeed = -5 - Collision de pagaie, vérifiez le côté de la pagaie que frappe la balle, gauche, droite si ((ball.x + ball.width * 0.5) < paddle.x) then xSpeed = -5 elseif((ball.x + ball.width * 0.5) >= paddle.x) then xSpeed = 5 end end - Exécuter le code principal ()
Dans la prochaine et dernière partie de la série, nous allons gérer les collisions de briques et de murs, les scores, les niveaux et les étapes finales à suivre avant la sortie, comme la création d’un test d’application, la création d’un écran de démarrage, l’ajout d’une icône et enfin la création du app. Restez à l'écoute pour la dernière partie!