【问题标题】:Pong - Ball Bouncing and Collision Detection AlgorithmPong - 球弹跳和碰撞检测算法
【发布时间】:2014-12-26 12:20:19
【问题描述】:

您好,我编写了这个简单的碰撞检测和弹跳算法,但是碰撞检测 y 就像它是 x 轴一样

bool Ball::DetectCollision(Paddle p)
{
if(GetPosition().y >= p.GetPosition().y + p.GetSize().y
|| GetPosition().y + GetSize().y <= p.GetPosition().y
|| GetPosition().x >= p.GetPosition().x + p.GetSize().x
|| GetPosition().x + GetSize().x <= p.GetPosition().x)
{
    return false;
}

if(GetPosition().y <= p.GetPosition().y + p.GetSize().y )
{
    Bounce(-1,1);
}
else if(GetPosition().y + GetSize().x >= p.GetPosition().y)
{
    Bounce(-1,1);
}

else if(GetPosition().x + GetSize().x >= p.GetPosition().x )
{
    Bounce(1,-1);
}
else if(GetPosition().x <= p.GetPosition().x + p.GetSize().x)
{
    Bounce(1,-1);
}


    return true;
}

void Ball::Bounce(int a, int b)
{
    velocity = sf::Vector2f(velocity.x * a,velocity.y * b);
}

起初它似乎在工作,我发现它只在一个轴上工作(如果球从底部或顶部击中桨,它不会正确反弹并且它会像撞到前面一样反弹桨的表面 -> ^|)

【问题讨论】:

    标签: c++ algorithm sfml pong


    【解决方案1】:

    在我看来,这条线

    else if(GetPosition().y + GetSize().x >= p.GetPosition().y)
    

    应该是

    else if(GetPosition().y + GetSize().y >= p.GetPosition().y)
    

    注意从 GetSize().x 到 GetSize().y 的变化

    看看能不能解决。干杯!

    【讨论】:

      【解决方案2】:

      要将碰撞检测添加到桨的顶部或底部(假设您指的是顶部或底部而不是前表面),请尝试在开始时稍微更改条件并在末尾添加新条件。

      首先,去掉开头条件中的等号。

        if(GetPosition().y > p.GetPosition().y + p.GetSize().y
      || GetPosition().y + GetSize().y < p.GetPosition().y
      || GetPosition().x > p.GetPosition().x + p.GetSize().x
      || GetPosition().x + GetSize().x < p.GetPosition().x)
      {
      

      尝试在末尾添加不嵌套的条件

      //Assuming origin at top-left of ball
      if((GetPosition().x  + GetSize().y/2 < p.GetPosition().x + p.GetSize() //GetSize().y/2 to point at center
      && GetPosition().x + GetSize().y/2 > p.GetPosition().x) /*if x-cord is between paddle*/
      && (GetPosition().y + getSize() == p.GetPosition().y || 
      GetPosition.y == p.GetPosition().y p.getSize())) /*if y-cord touches the top or bottom*/
           Bounce(1,-1); /*Bounce, change y velocity*/
      

      希望这行得通,我回答了你的问题。

      【讨论】:

      • 感谢您的努力,但这似乎不起作用
      【解决方案3】:

      当在 y 方向发生碰撞时,球应该在 y 方向反弹,但您执行 Bounce(-1,1) 实际上通过反转 x 方向速度在 x 方向反弹它,其他三种情况类似。 你应该这样做

       if((GetPosition().y <= p.GetPosition().y + p.GetSize().y )&& (GetPosition().y >= p.GetPosition().y))
       Bounce(1,-1);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-07-12
        • 2018-01-28
        • 1970-01-01
        • 1970-01-01
        • 2010-10-21
        • 2016-09-08
        • 1970-01-01
        相关资源
        最近更新 更多