乒乓球弹跳与碰撞检测算法

时间:2014-12-26 12:20:20

标签: c++ algorithm sfml pong

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

enter image description here

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

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

3 个答案:

答案 0 :(得分:1)

在我看来这行

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

应该是

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

注意从GetSize()。x到GetSize()。y

的更改

看看是否解决了这个问题。干杯!

答案 1 :(得分:0)

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

首先,在开始条件下摆脱等号。

  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*/

希望这有效,我回答了你的问题。

答案 2 :(得分:0)

当y dir发生碰撞时,球应该在y中反弹,但是你会Bounce(-1,1)通过旋转x方向速度实际上在x方向上反弹,而其他三种情况则相似。 你应该做

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