BREAKOUT Project - Help with collision detection

Hello everyone, it’s me, again!

Since my last posts yesterday, I learned that I couldn’t use Class, Object and ArrayList so I had to redo everything.

I used an array for my “for loop” that draws my bricks. For the collision, I did the same way I did for the paddle as @BeastCoder suggested. It is functioning but I have got some problems with the collision detection.

Sometimes, the ball will hit a brick and it is the one next to it that will disappear and not the one that got hit.

Sometimes, the ball will hit a brick’ side and it won’t disappear at all.

Here is my code :

//Briques
int[] blocks = new int[50];
int bh = 30; //Hauteur 
int bw = 100; //Largeur

//Variables de ma balle
float xBalle = 650; //Position x
float yBalle = 400; //Position y
float xSpeed = 3; //Vitesse
float ySpeed = 3; //Vitesse

//Variables du paddle
int xPaddle = 600; //Position x
int yPaddle = 650; //Position y 
int Paddle = 100; 


void setup(){
  int i;
  size(1200, 800); //Taille de la fenêtre - les dimensions de la fenêtre ont été changées pour mieux s'adapter à celles de mon écran
  
  //Array pour les briques 
  for (i=0; i<50; i++) {
    blocks[i] = 1;
  }
}

void draw(){
  int i; //Boucle
  int bx; //Briques x
  int by; //Briques y
  background (0);

//Je fais bouger ma balle
  xBalle = xBalle + xSpeed; //Ajout de vitesse à ma xBalle
  if (xBalle > width || xBalle < 0){ //Ma balle ne sort pas de l'écran par les côtés
  xSpeed = xSpeed * -1; //Inverse vitesse
  }  
  yBalle = yBalle + ySpeed; //Ajout de vitesse à ma yBalle
  if (yBalle > height || yBalle < 0){ //Ma balle ne sort pas de l'écran par le haut et le bas
  ySpeed = ySpeed * -1; //Inverse vitesse
  }
  
  //Je dessine ma balle
  fill(255); 
  stroke(255); 
  ellipse (xBalle,yBalle,20,20); //Si diamètre 40, rayon 20
  
  //Je fais bouger mon paddle - keyPressed
  if (keyPressed){
    if(keyCode == RIGHT){ //bouton DROIT
    //Déplacement du paddle à droite
    xPaddle = xPaddle + 10; 
    } else if (keyCode == LEFT){ //bouton GAUCHE
    //Déplacement du paddle à gauche
    xPaddle = xPaddle - 10; 
    }
  }
  
  //Le paddle ne sort pas de l'écran par les côtés 
   if (xPaddle > width) 
   xPaddle = width;
   if (xPaddle < 0) 
   xPaddle = 0;
  
  //Je dessine mon paddle 
  fill(255); 
  stroke(255); 
  rectMode(CENTER);
  rect(xPaddle,yPaddle,200,10); 
  
  //Ma balle rebondit sur le paddle   
    if ((xPaddle - Paddle) < xBalle && (xPaddle + Paddle) > xBalle && 
    (yPaddle - 10) < yBalle && (yPaddle) > yBalle) {
    // Si la balle rebondit sur le paddle, inverse la vitesse 
    ySpeed = - ySpeed;
  }
  
  //Je dessine mes briques - boucle for 
  for (i=0; i<50; i++) {
    bx = i%10*110+10; 
    by = 40*(i/10)+10; 
    // Les briques apparaissent et sont dessinées si blocks[i]==1, elles disparaissent si blocks[i]==0
    if (blocks[i]==1) { 
      // Draw the block
      fill(255);
      stroke(0);
      rect(bx+100, by+10, bw, bh);
    }
    //Détection collision entre ma balle et les briques
    //Haut-bas des briques
    if(xBalle > (bx+10) && xBalle < (bx+90) &&
    yBalle > by && yBalle<(by+30) && blocks[i]==1){ //OK
      blocks[i]=0; //Disparition
      ySpeed = - ySpeed;
  }
    //Détection collision entre ma balle et côté 
   if (((xBalle > (bx-5) && xBalle < bx) || (xBalle > (bx+100) && xBalle < (bx+105))) &&
      yBalle > by && yBalle < (by+30) && blocks[i]==1) { //OK
      blocks[i]=0; //Disparition
      xSpeed = - xSpeed;
      }
      
    //Détection suite
    if (((xBalle > (bx-5) && xBalle < (bx+10)) || (xBalle > (bx+100) && xBalle < (bx+90))) &&
      yBalle > by && yBalle <(by+30) && blocks[i]==1) { //OK
      blocks[i]=0; //Disparition
      xSpeed = - xSpeed; 
      ySpeed = - ySpeed;
  }
  }
}

I think that the disfunctioning comes from here :

//Détection collision entre ma balle et les briques
    //Haut-bas des briques
    if(xBalle > (bx+10) && xBalle < (bx+90) &&
    yBalle > by && yBalle<(by+30) && blocks[i]==1){ //OK
      blocks[i]=0; //Disparition
      ySpeed = - ySpeed;
  }
    //Détection collision entre ma balle et côté 
   if (((xBalle > (bx-5) && xBalle < bx) || (xBalle > (bx+100) && xBalle < (bx+105))) &&
      yBalle > by && yBalle < (by+30) && blocks[i]==1) { //OK
      blocks[i]=0; //Disparition
      xSpeed = - xSpeed;
      }
      
    //Détection suite
    if (((xBalle > (bx-5) && xBalle < (bx+10)) || (xBalle > (bx+100) && xBalle < (bx+90))) &&
      yBalle > by && yBalle <(by+30) && blocks[i]==1) { //OK
      blocks[i]=0; //Disparition
      xSpeed = - xSpeed; 
      ySpeed = - ySpeed;
  }
  }

But I am not sure about it. What do you guys think?

Thanks again!

1 Like