• Advertisement
Sign in to follow this  

Improper 2D Collision reaction - pong

This topic is 1368 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

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);
        }

    }
}

Share this post


Link to post
Share on other sites
Advertisement

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.

Share this post


Link to post
Share on other sites
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.

Share this post


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

  • Advertisement