2012-03-09 13 views
6

私は卓球用の単純な連続衝突検出を実装しようとしていますが、私はこの権利を実装しているか理解しているかどうかはわかりません。 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ディメンションと他のディメンションとの衝突を確認しているようです。

2次元空間で2つのオブジェクトが衝突しているかどうかを比較することをお勧めします。これは、各オブジェクトの境界矩形を調整し、矩形が重なっているかどうかをチェックすることで簡単に行うことができます。それであなたのforループでボールの矩形をそれに応じて調整することができます

+0

ああ、そうですよ!私はこれについてあまりにも長い間取り組んできました。私はY次元をチェックしないという副作用を忘れてしまった。 – RedShft