Tuto Casse Briques mise Ă  jour

Bonjour Ă  vous tous.
Je viens de finir le tuto du casse briques et j’ai vu une erreur : la réinitialisation du niveau ne se fait pas une fois que toutes les briques ont été détruites. En cherchant sur le forum j’ai eu du mal à trouver la réponse. Je vous partage ici la solution que j’ai trouvé pour plus de simplicité.
Je rajoute aussi une modification des collisions avec la raquette pour un comportement plus logique de la balle Ă  mon avis.

Alors la première chose dans le code miseAJour

  if (gb.collide.rectRect(briqueX, briqueY, BRIQUE_LARGEUR, BRIQUE_HAUTEUR, balleX, balleY, BALLE_TAILLE, BALLE_TAILLE)){
    ballespeedY *= -1;
    brique[rangee][colonne] = 0;
    bool PlusDeBrique = true;
    for (int x = 0; x < GRILLE_TAILLE; x += 1){
      for (int y = 0; y < GRILLE_TAILLE; y += 1){
        if (brique[x][y] == 1){
          PlusDeBrique = false;
        }
      }
    }

Dans le tuto il y a Ă©crit

    if (brique[x][y] == 0){
      PlusDeBrique = false;
    }

il faut alors mettre 1 à la place de 0 si on veut que le système réinitialise le niveau une fois vide.

Pour la deuxième modification je vous propose d’approfondir la collision avec la raquette. Pour faire simple :

  • si la balle vient de gauche et touche la partie gauche de la raquette alors elle repart Ă  gauche
  • si la balle vient de gauche et touche la partie droite de la raquette alors elle continue sur la droite
  • si la balle vient de droite et touche la partie droite de la raquette alors elle repart Ă  droite
  • si la balle vient de droite et touche la partie gauche de la raquette alors elle part Ă  gauche

En code ça donne ça du coup :

if (gb.collide.rectRect(balleX, balleY, BALLE_TAILLE, BALLE_TAILLE, raquetteX, RAQUETTE_Y, RAQUETTE_LARGEUR, RAQUETTE_HAUTEUR)){
  if (ballespeedX == 1 && balleX + BALLE_TAILLE < raquetteX + RAQUETTE_LARGEUR / 2){
    ballespeedX *= -1;
  }else if (ballespeedX == 1 && balleX + BALLE_TAILLE >= raquetteX + RAQUETTE_LARGEUR / 2){
    ballespeedX *= 1;
  }
  if (ballespeedX == -1 && balleX + BALLE_TAILLE < raquetteX + RAQUETTE_LARGEUR /2){
    ballespeedX *= 1;
  }else if (ballespeedX == -1 && balleX + BALLE_TAILLE >= raquetteX + RAQUETTE_LARGEUR / 2){
    ballespeedX *= -1;
  }
  ballespeedY *= -1;
}

voilĂ  pour ma petite contribution Ă  ce Tuto

1 Like

De nombreuses choses pourraient être améliorées et optimisées sur ce tuto… La réalisation d’un casse-brique est loin d’être triviale si on veut modéliser les choses proprement.

Concernant les améliorations possibles sur la prise en compte du rebond de la balle sur la raquette, on peut un peu affiner les choses en assimilant la surface de la raquette à une forme convexe simple comme une ellipse. Le vecteur vitesse après le rebond peut alors être calculé par symétrie par-rapport à la normale de la tangente à l’ellipse au point de contact :

Ça permet de rendre le jeu un peu moins monotone…