Does (ballX, ballY) represent the center of the ball, or the top-left edge of the bounding square?
For one, this if statement looks somewhat "iffy":
if (ballY < 0 || ballY > (getHeight()-25) && ballX > paddleX && ballX < (paddleX +50))
Consider grouping the conditions with parenthesis more.. I assume the paddle appears on the top and bottom of the screen.
For blocks, you have to test:
Ball intersects block horizontally (at left OR right) AND vertically (at top OR bottom), therefore...
Horizontally:
If (ballX + ballWidth) >= blockX
Or if ballX <= (blockX + blockWidth)
And vertically:
If (ballY + ballHeight) >= blockY
Or if ballY <= (blockY + blockHeight)
The above considers the ball's bounding box... So, it treats the ball like a square, with (ballX, ballY) represening the top-left corner.
Helpful? Hmmm..
Cudmore
Junior Poster in Training
74 posts since Nov 2005
Reputation Points: 20
Solved Threads: 6
This method would take the ball's coordinates from its center, its radius, and a Block object. It'll return true if they're overlapping.
public boolean overlap(int bx, int by, int radius, Block block)
{
int x1 = block.getX();
int y1 = block.getY();
int x2 = block.getX() + 30;
int y2 = block.getY() + 10;
if ((bx+radius > x1) && (bx-radius < x2) && (by+radius > y1) && (by-radius < y2))
{
return true;
}
return false;
}
While this works for simple games, it only works as long as the ball's speed does not exceed the width or height of a brick. For instance, if a brick is 10 units tall and a ball moves vertically at 15units per loop, then there's a possibility that it could skip right over the brick and never trigger a collision. So even though we would see that the ball appeared to pass right through the block, the code never sees the two objects overlap.
A solution for this is to use swept-collision. This is where you take the ball's old position of the last game loop and its new position of the current loop and form a line segment. Then using line segment AB (the ball's path) you check if it intersects the rectangle of the block. The algorithm for that could return a time index of when the line would intersect the block. If the value is between o and 1, then there was a collision. Anything outside of that range means there could be an intersection should the line segment continue indefinitely.
Phaelax
Practically a Posting Shark
858 posts since Mar 2004
Reputation Points: 92
Solved Threads: 51