Jump to content
  • Advertisement
Sign in to follow this  
stein102

Breakout collision problem?

This topic is 2027 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

This is my code for the ball colliding with the paddle in my game. As of right now, if the ball approaches the paddle and hits it on the corner, the ball seems to get trapped inside of the paddle. Any suggestions?

 

I'm using the Slick2d API if it makes a difference.

		if (ball.ballCircle.intersects(paddle.paddleRect)) {
			//left
			if(ball.ballCircle.getMaxX() <= paddle.paddleRect.getMinX()){
				ball.ballCircle.setCenterX(paddle.paddleRect.getMinX()-ball.ballCircle.getRadius()-1);
				ball.setDx(-ball.getDx());
			}
			//Right
			if( ball.ballCircle.getMinX() >= paddle.paddleRect.getMaxX()){
				ball.ballCircle.setCenterX(paddle.paddleRect.getMaxX()+ball.ballCircle.getRadius()+1);
				ball.setDx(-ball.getDx());
			}
			//Top
			if(ball.ballCircle.getMaxY() <= paddle.paddleRect.getMinY()){
				ball.ballCircle.setCenterY(paddle.paddleRect.getMinY()-ball.ballCircle.getRadius()-1);
				ball.setDy(-ball.getDy());
			}	
		}
Edited by stein102

Share this post


Link to post
Share on other sites
Advertisement

		if (ball.ballCircle.intersects(paddle.paddleRect)) {
			//left
			if(ball.ballCircle.getMaxX() <= paddle.paddleRect.getMinX()){
				ball.ballCircle.setCenterX(paddle.paddleRect.getMinX()-ball.ballCircle.getRadius()-1);
				ball.setDx(-ball.getDx());
			}
			//Right
			if( ball.ballCircle.getMinX() >= paddle.paddleRect.getMaxX()){
				ball.ballCircle.setCenterX(paddle.paddleRect.getMaxX()+ball.ballCircle.getRadius()+1);
				ball.setDx(-ball.getDx());
			}
			//Top
			if(ball.balllCircle.getMaxY() <= paddle.paddleRect.getMinY()){
				ball.ballCircle.setCenterY(paddle.paddleRect.getMinY()-ball.ballCircle.getRadius()-1);
				ball.setDy(-ball.getDy());
			}	
		}

 

Is it possible you've got the comparison operators wrong?

I.e.

 

 

        if (ball.ballCircle.intersects(paddle.paddleRect)) {
            //left (was <=, now >=)
            if(ball.ballCircle.getMaxX() >= paddle.paddleRect.getMinX()){
                ball.ballCircle.setCenterX(paddle.paddleRect.getMinX()-ball.ballCircle.getRadius()-1);
                ball.setDx(-ball.getDx());
            }
            //Right (was >=, now <=)
            if( ball.ballCircle.getMinX() <= paddle.paddleRect.getMaxX()){
                ball.ballCircle.setCenterX(paddle.paddleRect.getMaxX()+ball.ballCircle.getRadius()+1);
                ball.setDx(-ball.getDx());
            }
            //Top (was <=, now >=)
            if(ball.balllCircle.getMaxY() >= paddle.paddleRect.getMinY()){
                ball.ballCircle.setCenterY(paddle.paddleRect.getMinY()-ball.ballCircle.getRadius()-1);
                ball.setDy(-ball.getDy());
            }    
        }
 

 

Matt

Edited by de_mattT

Share this post


Link to post
Share on other sites

Hello, I would recommend adding an extra if statement, assuming that your x velocity is dx, make sure that the velocity is not already going the appropriate direction, and possibly remove the manual positioning before that. Run it all from adjusting the velocity of the ball. That way, you just check if it needs to change direction based upon the collision, and fix it if it does need to.

 

if (ball.ballCircle.intersects(paddle.paddleRect)) {
			//left
			if(ball.ballCircle.getMaxX() <= paddle.paddleRect.getMinX() && ball.getDX() > 0){
				
				ball.setDx(-ball.getDx());
			}
			//Right
			if( ball.ballCircle.getMinX() >= paddle.paddleRect.getMaxX() && ball.getDx() < 0){
				ball.setDx(-ball.getDx());
			}
			//Top
			if(ball.ballCircle.getMaxY() <= paddle.paddleRect.getMinY()){
				ball.ballCircle.setCenterY(paddle.paddleRect.getMinY()-ball.ballCircle.getRadius()-1);
				ball.setDy(-ball.getDy());
			}	
		}

 

Think I have those right...

Share this post


Link to post
Share on other sites

I've tried both suggestions and neither one seems to work. As for the second suggestion, if you hit the paddle near the edge, the ball just goes right through the paddle. I cant quite place my finger on what's wrong here.

Share this post


Link to post
Share on other sites

Weird... I would have thought it would work. So, I programmed a breakout game myself last night using libgbx, and now that I have internet access here is the paddle collision. (It works great for me)

 

If you want more code, let me know, though the ball ricochets from the bricks sometimes in a way I didn't mean it to when doing initial coding (down if two bricks, easy enough fix, but what are you going to do in an hour?).

 

if (Intersector.overlapCircleRectangle(ball, paddle)
							&& ball.getyVelocity() < 0) {
						float totalVelocity = MathUtils.random(
								Ball.MIN_TOTAL_VELOCITY,
								Ball.MAX_TOTAL_VELOCITY);

						// need offset from center of paddle
						float xPercent = (ball.x - paddle.x - (paddle.width / 2f))
								/ (paddle.width / 2f);
						if (Math.abs(xPercent) > .95f) {
							if (xPercent > 0) {
								xPercent = .95f;
							} else {
								xPercent = -.95f;
							}
						}

						ball.setxVelocity(totalVelocity * xPercent);
						ball.setyVelocity(totalVelocity
								* (1f - Math.abs(xPercent)));
					}

Share this post


Link to post
Share on other sites

Okay, I think I have it fixed now. I changed it to the following and after a few tests, it seems to hold. What was happening was that if you hit the paddle right on the corner, the overlap on the Y-axis was coming out to a really large number for some reason and bypassing my collision check. Any ideas why the overlap would be so large? I'm curious now about why that happened.

 

		if (ball.ballCircle.intersects(paddle.paddleRect)) {
			//Top
			//left
			if(ball.ballCircle.getMaxX()-ball.getAbsDx() <= paddle.paddleRect.getMinX()){
				ball.ballCircle.setCenterX(paddle.paddleRect.getMaxX()+ball.ballCircle.getRadius()-ball.getAbsDx());
				ball.setDx(-ball.getDx());
			}
			//Right
			else if( ball.ballCircle.getMinX()+ball.getAbsDx() >= paddle.paddleRect.getMaxX()){
				ball.ballCircle.setCenterX(paddle.paddleRect.getMaxX()+ball.ballCircle.getRadius()+ball.getAbsDx());
				ball.setDx(-ball.getDx());
			}	
			else{
				ball.ballCircle.setCenterY(paddle.paddleRect.getMinY()-ball.ballCircle.getRadius()-ball.getAbsDy());
				ball.setDy(-ball.getDy());
			}
			solidSound.play();
		}
Edited by stein102

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!