• Create Account

## Improper 2D Collision reaction - pong

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

2 replies to this topic

### #1Ofasix  Members

104
Like
0Likes
Like

Posted 24 April 2014 - 04:50 AM

Hello.

To perpetuate lazyfoo's SDL2 tutorial, i decided to make pong game. Everything was fine untill I did not need to detect collisions. My ball(Which is square to make it simpler) reacting on top, bottom, and left side of paddle(horizontal rectangle) and its bounces in right direction, but when ball meet right side its acting weird. Its going trough paddle, returns and bouces in other direction. Someone could point me right direction how to do this collision reaction. Here is a video which showes problem. Here is whole game source on pastebin.
My collision detection function is same as LazyFoo's.

bool checkCollide(SDL_Rect a, SDL_Rect b)
{
//The sides of the rectangles
int leftA, leftB;
int rightA, rightB;
int topA, topB;
int bottomA, bottomB;

//Calculate the sides of rect A
leftA = a.x;
rightA = a.x + a.w;
topA = a.y;
bottomA = a.y + a.h;

//Calculate the sides of rect B
leftB = b.x;
rightB = b.x + b.w;
topB = b.y;
bottomB = b.y + b.h;

//If any of the sides from A are outside of B
if( bottomA <= topB )
{
return false;
}

if( topA >= bottomB )
{
return false;
}

if( rightA <= leftB )
{
return false;
}

if( leftA >= rightB )
{
return false;
}

//If none of the sides from A are outside B
return true;

}

Collision reaction checking:

{
{

if(mProperties.x + (mProperties.w / 2) < paddle.GetProperties().x - 10) {
mVelX *= (-1);
}
else if(mProperties.x + (mProperties.w / 2) > paddle.GetProperties().x - 10)
{
mVelY *= (-1);
}
else if(mProperties.y + (mProperties.h / 2) < paddle.GetProperties().y - 10) {
mVelX *= (-1);
}
else if(mProperties.y + (mProperties.h / 2) > paddle.GetProperties().y - 10) {
mVelY *= (-1);
}

}
}

### #2Strewya  Members

2607
Like
1Likes
Like

Posted 24 April 2014 - 06:27 AM

What is the magic 10 in your checkCollision function? And why is it always subtracted?

I'm going to make a guess.

You don't clear the paddle and ball out out the collision, which means that on your next frame update, they are still in collision, and the same piece of code triggers again, and switches the velocity again, which causes the ball to glide.

However, you code seems a bit wonky, with x and y coordinates mixed with each other, and that magic 10 always being subtracted looks really suspicious. Have you tried debugging the code? Place a breakpoint at the inner if clause, and see what the values are, and where the code flows on each step, it might help.

devstropo.blogspot.com - Random stuff about my gamedev hobby

### #3Ofasix  Members

104
Like
0Likes
Like

Posted 24 April 2014 - 07:32 AM

This 10 was an offset to make larger/smaller bounding box.
Ok, i tried something and seems to work.
Now im checking if is there collision and ball position fits in range x-xw(and y-yh ofc too) paddle. Works for now, and i guess in few test it will fail as always. But works for now.

Old topic!

Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.