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:
void Ball::checkCollision(Paddle& paddle)
{
if(checkCollide(mProperties,paddle.GetProperties()))
{
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);
}
}
}