2012-03-09 141 views
6

我试图为我的pong游戏实现简单的连续碰撞检测,但是我不确定我正在执行或理解此权限。 AFAIR连续碰撞检测用于可能通过另一个物体的快速移动物体,从而绕过正常的碰撞检测。2D连续碰撞检测

那么我想是因为只有快速移动的物体我有一个球我只需要球的位置,它的移动速度,并且我们是在比较对象的位置。

从这个我想这将是最好的,例如如果球的移动速度表示,它正在向左移动,我会比较它的最左边的结合到最右边界其他物体。从这里我将通过将移动速度添加到球的最左边界并进行比较以确保其大于其他对象的右边界。这将表明没有左右碰撞。

我有事有些工作,但遗憾的是,球开始了一段时间,通常反弹则充当如果它击中桨时,无所不有。

我有点失落,任何帮助,将不胜感激!

static bool CheckContinuousCollision(PActor ball, PRect ballRect, PActor other, PRect otherRect) 
{ 
    PVector ballMoveSpeed; 
    int ballXLimit; 
    int ballYLimit; 

    ballMoveSpeed = ball.moveSpeed; 

    // We are moving left 
    if (sgn(ball.moveSpeed.x) < 0) 
    { 
     ballXLimit = std.math.abs(ballMoveSpeed.x)/2; 

     for (int i = 0; i <= ballXLimit; i++) 
     { 

       if (ballRect.Left < otherRect.Right && otherRect.Left < ballRect.Left) 
      { 
       return true; 
      } 

      ballRect.Left -= i; 
     } 
    } 

      //We are moving right 
    if (sgn(ball.moveSpeed.x) > 0) 
    { 
     ballXLimit = std.math.abs(ballMoveSpeed.x)/2; 

     for (int i = 0; i < ballXLimit; i ++) 
     { 

      if (ballRect.Right > otherRect.Left && ballRect.Right < otherRect.Right) 
      { 
       return true; 
      } 

      ballRect.Right += i; 
     } 
    } 
      // we are not moving 
    if (sgn(ball.moveSpeed.x) == 0) 
    { 
     return false; 
    } 
} 

回答

1

您似乎在检查只有一个维度的碰撞,即您的球的X维度与您的其他维度的碰撞。

你可能需要的是比较两个对象是否在二维空间碰撞。这可以通过调整每个对象的Bounding Rectangle并检查矩形是否重叠来轻松完成。然后在你的for循环中,你可以相应地调整你的Ball矩形

+0

哦,你是对的!我一直在努力工作太久。我忘记了不检查Y尺寸的副作用。 – RedShft 2012-03-09 04:34:51