0
\$\begingroup\$

need help with collision between ball and rect. i dont know how to test if ball hit the rec from top, bottom, right or left.

x = ball x
y = ball y
radius = ball width and height
rx = rect x
ry = rect y
rheight = rect height
rwidth = rect width



main game loop:

x += dx;   //keep the ball moving so i can test the collision
y += dy;

//collsion between ball and box
if(x+radius > rx && x < rx+rwidth)
 {
if(y+radius > ry && y < ry+rheight)
{
  if(y+radius == ry) 
    {  
    System.out.println("top");
    }
   else  if(y == ry+rheight) 
    {
     System.out.println("bottom");
    }
   else if(x+radius == rx)
        {
    System.out.println("left");
        }
     else if(x == rx+rwidth)
    {
     System.out.println("right");
    }
   }
}
\$\endgroup\$
1

1 Answer 1

1
\$\begingroup\$

The code that you are using does not check for the collisions from right and bottom side, it only checks when the ball collides from top left side.case 1case 2

For this case the above code fails to check for a collision
case 3

take a look at this code its just basic detection not very accurate but you should get the point. Hope this helps.

if (ballLocation.Center.Y > BrickLocation.Y && ballLocation.Center.Y < (BrickLocation.Y + BrickLocation.Height))
            {
                if (BrickLocation.Center.X > ballLocation.Center.X)
                {
                    velocity.X = mod(velocity.X) * -1;
                }
                else if (BrickLocation.Center.X < ballLocation.Center.X)
                {
                    velocity.X = mod(velocity.X);
                }
            }
            else if (ballLocation.Center.X > BrickLocation.X && ballLocation.Center.X < (BrickLocation.X + BrickLocation.Width))
            {
                if (BrickLocation.Center.Y < ballLocation.Center.Y)
                {
                    velocity.Y = mod(velocity.Y);
                }
                else if (BrickLocation.Center.Y > ballLocation.Center.Y)
                {
                    velocity.Y = mod(velocity.Y) * -1;
                }
            }
\$\endgroup\$

Not the answer you're looking for? Browse other questions tagged .