Plutôt que de mettre le code en entier, je préfère faire quelques explications sur les parties les plus importante à mon goût. En ce qui concerne l'utilisation et la gestion des movieClips, je vous renvoie sur le tuto du même nom.

 

Création des niveaux

Le plus simple est d'utiliser un tableau pour chaque niveau.

bricks = new Array();
for ( y in 0...15 ) { // taille de mes niveaux
    for ( x in 0...12 ) {
        if (tabNiveau[y][x] == 1) {
            var newBrick:Brick = new Brick();
            // On fait les espacements nécessaires
            newBrick.x = 25*x;
            newBrick.y = 11*y+Cst.WALL_TOP+2;
// la variable Cst.WALL_TOP est une constante stockée dans le fichier Cst.hx dans la classe du même nom
            mv_main.addChild(newBrick);
            bricks.push(newBrick); // on met la cellule en fin de tableau
        }
    }
}

 

Mouvement de la raquette

On calcule la position de la raquette en fonction de la position de la souris :

private function movePaddle():Void {
    var newX:Float = Math.min(Cst.WALL_RIGHT-Cst.PADDLE_WIDTH/2,Math.max(Cst.WALL_LEFT+Cst.PADDLE_WIDTH/2,mouseX));
    mv_paddle.x = newX - (Cst.PADDLE_WIDTH/2);
}

 

Mouvement de la balle

Le mouvement de la balle est relativement simple. Ça se compliquera lorsqu'on devra détecter les collisions.
Les déplacements sont calculés en fonction du temps.

// calcul du nouvel emplacement pour la balle
if (lastTime == 0) lastTime = Lib.getTimer();
var timePassed:Float = Lib.getTimer()-lastTime;
lastTime += timePassed;
var newBallX = mv_ball.x + ballDX*timePassed;
var newBallY = mv_ball.y + ballDY*timePassed;

 

Détection des collisions

C'est ici que ça se complique.
Pour détecter les collisions, il faut tout d'abord calculer la position future. Le plus simple c'est de faire un rectangle à la place de la future position de la balle et de détecter si collision il y aura.

var oldBallRect = new Rectangle(mv_ball.x, mv_ball.y, Cst.BALL_SIZE, Cst.BALL_SIZE);
var newBallRect = new Rectangle(newBallX, newBallY, Cst.BALL_SIZE, Cst.BALL_SIZE);
var paddleRect = new Rectangle(mv_paddle.x, mv_paddle.y, Cst.PADDLE_WIDTH, Cst.PADDLE_HEIGHT);


oldBallRect correspond à la position actuelle de la balle. newBallRect, à la future et paddleRect à la raquette.
Les tests seront effectués à partir de ces nouvelles variables.
Les tests à faire sont les suivants :

  • collisions avec les murs
  • collisions avec la raquette
  • collisions avec les briques
  • sortie de la balle et fin de partie



Affichage des écrans intermédiaires

Sur son site, jeanffy a developpé une librairie permettant, entre autre, l'ajout d'écran d'accueil facilement. Pour ma part je ne l'ai pas utilisée mais elle me semble relativement utile et facile d'utilisation.


Fin du jeu

Il suffit de supprimer les écouteurs et de réinitialiser les attributs de classe.
Faire une boucle sur le tableau du niveau, et supprimer chaque brique.
Le movieClip mv_main correspond au movieClip principal (flash.Lib.current).

private function endGame():Void {
    mv_main.removeChild(mv_paddle);
    var i = bricks.length-1;
    while (i>=0) {
        mv_main.removeChild(bricks[i]);
        i--;
    }
    mv_paddle = null;
    bricks = null;
    // suppression de la balle
    if (mv_ball!=null) {
        mv_main.removeChild(mv_ball);
        mv_ball = null;
    }
        
    // On supprime les écouteurs
    mv_main.removeEventListener(Event.ENTER_FRAME, moveObjects);
    mv_main.removeEventListener(MouseEvent.CLICK, fireball);
}

 

Aller plus loin

Maintenant, à votre tour. Faites parler votre imagination, en ajoutant, par exemple, la gestion du score, ...

 

Voici les sources, et le jeu :

Votre lecteur Flash n'est pas à jour. Installer la dernière version