Advertisement

Improper 2D Collision reaction - pong

Started by April 24, 2014 10:50 AM
1 comment, last by Ofasix 10 years, 9 months ago

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

    }
}

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

Advertisement
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.

This topic is closed to new replies.

Advertisement