Collision Detection - Micro Java

Thread Solved

Join Date: Mar 2006
Posts: 7
Reputation: Doops is an unknown quantity at this point 
Solved Threads: 0
Doops's Avatar
Doops Doops is offline Offline
Newbie Poster

Collision Detection - Micro Java

 
0
  #1
Feb 8th, 2007
ok, I have created a mobile application for a java enabled phone. I want to make the classic pong game with one paddle, and a number of blocks to break. I have managed to get the ball bouncing around the screen and off the block using a set of if statements checking the location of the ball against the location of the paddle and walls. So the next step is to get ball bouncing off the blocks. So i have a Block() class and within the initialisation I have managed to make an array of blocks to appear on the screen. So the collision detection is next. I have tried the following code but the ball just misses the blocks altogether, I don't understand why the ball is not bouncing off the blocks. The code is on the ball thread, I am simply trying to check the location of the ball against each blocks location. Any help would be great.
  1. public void moveBall() {
  2. while (true) {
  3. ballX += incrementX;
  4. ballY += incrementY;
  5. //hits sides
  6. if (ballX < 0 || ballX > (getWidth()-10)) {
  7. incrementX = -incrementX;
  8. }
  9. //hits paddle or roof
  10. if (ballY < 0 || ballY > (getHeight()-25) && ballX > paddleX && ballX < (paddleX +50)) {
  11. incrementY = -incrementY;
  12. }
  13. //goes out past the paddle
  14. if (ballY >= getHeight()) {
  15. lives -= 1;
  16. ballX = ((getWidth()/2)-5);
  17. ballY = ((getHeight()/2)-5);
  18. }
  19. //hits a block
  20. for (int i = 0; i < 14; i++) {
  21. if ((ballY < blockArray[i].getY() + 10) && (ballX > blockArray[i].getX()) && (ballX < blockArray[i].getX()+30)) {
  22. incrementY = -incrementY;
  23. }
  24. }
  25. repaint();
  26.  
  27. try {
  28. Thread.sleep(10);
  29. } catch (InterruptedException e) {
  30. e.printStackTrace();
  31. }
  32.  
  33. }
  34. }
Reply With Quote Quick reply to this message  
Join Date: Nov 2005
Posts: 74
Reputation: Cudmore is an unknown quantity at this point 
Solved Threads: 5
Cudmore's Avatar
Cudmore Cudmore is offline Offline
Junior Poster in Training

Re: Collision Detection - Micro Java

 
0
  #2
Feb 8th, 2007
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..
synchronized (theWorld) { System.out.println ("It's all mine..."); }
How many people have code in their Sigs?
Reply With Quote Quick reply to this message  
Join Date: Mar 2006
Posts: 7
Reputation: Doops is an unknown quantity at this point 
Solved Threads: 0
Doops's Avatar
Doops Doops is offline Offline
Newbie Poster

Re: Collision Detection - Micro Java

 
0
  #3
Feb 10th, 2007
BallX and BallY refers to the top left most pixel of the sprite. Thanks for the help
Reply With Quote Quick reply to this message  
Join Date: Mar 2004
Posts: 763
Reputation: Phaelax is on a distinguished road 
Solved Threads: 38
Phaelax Phaelax is offline Offline
Master Poster

Re: Collision Detection - Micro Java

 
0
  #4
Feb 12th, 2007
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.

  1. public boolean overlap(int bx, int by, int radius, Block block)
  2. {
  3. int x1 = block.getX();
  4. int y1 = block.getY();
  5. int x2 = block.getX() + 30;
  6. int y2 = block.getY() + 10;
  7.  
  8. if ((bx+radius > x1) && (bx-radius < x2) && (by+radius > y1) && (by-radius < y2))
  9. {
  10. return true;
  11. }
  12. return false;
  13. }

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.
Reply With Quote Quick reply to this message  
Join Date: Mar 2006
Posts: 7
Reputation: Doops is an unknown quantity at this point 
Solved Threads: 0
Doops's Avatar
Doops Doops is offline Offline
Newbie Poster

Re: Collision Detection - Micro Java

 
0
  #5
Feb 12th, 2007
Hey, thanks for the replies, I have managed o sort it out using the collideswith(Sprite s) method. Still got lots of little glitches but I think I can Iron those out easy enough. Thanks again.
Reply With Quote Quick reply to this message  
Join Date: Sep 2008
Posts: 3
Reputation: Bunter is an unknown quantity at this point 
Solved Threads: 0
Bunter Bunter is offline Offline
Newbie Poster

Re: Collision Detection - Micro Java

 
-1
  #6
Sep 11th, 2008
hello!!can you give me all the code?thanks
Reply With Quote Quick reply to this message  
Join Date: Nov 2008
Posts: 7
Reputation: mjta18 is an unknown quantity at this point 
Solved Threads: 0
mjta18 mjta18 is offline Offline
Newbie Poster

Re: Collision Detection - Micro Java

 
0
  #7
Nov 15th, 2008
hi mr. cudmore... can you please tell me some tutorial site or where can i get codes about making java applets. im planning to make a m-learning using netbeans... but i cant start because i dont have background about this... thanks
Reply With Quote Quick reply to this message  
Reply

This thread has been marked solved.
Perhaps start a new thread instead?
Message:



Similar Threads
Other Threads in the Java Forum
Thread Tools Search this Thread



About Us | Contact Us | Advertise | DaniWeb | Acceptable Use Policy | RSS Feed

©2003 - 2009 DaniWeb® LLC