Jump to content

  • Log In with Google      Sign In   
  • 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.

  • You cannot reply to this topic
2 replies to this topic

#1 Ofasix   Members   -  Reputation: 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:

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

    }
}


Sponsor:

#2 Strewya   Members   -  Reputation: 1151

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


#3 Ofasix   Members   -  Reputation: 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.



PARTNERS