0

私はAABBの衝突について読んでいます。現在、かなり大まかな実装があります。これで、2つの長方形がX軸とY軸の両方で交差するタイミングを検出できるようになりました。

Xの交差の深さを計算するには、基本的に次のようにします。

overlapX = (Game1.p[0].boundingBox.halfWidth + Game1.p[1].boundingBox.halfWidth)
- (Math.Abs(Game1.p[0].boundingBox.center.X  - Game1.p[1].boundingBox.center.X));

現在、問題がどこにあるかを確認したいので、Xで深度をテストしています。私は、左または右の方向を考慮していません。p[0]オブジェクトがp[1]の左側で衝突していると仮定しています。

次に、実際の動きと衝突検出について:

 public void Move(float x, float y)
 {
     Position.X += x;
     Position.Y += y;

     overlapX = (Game1.p[0].boundingBox.halfWidth
              +  Game1.p[1].boundingBox.halfWidth)
              - (Math.Abs(Game1.p[0].boundingBox.center.X
              - Game1.p[1].boundingBox.center.X));

     overlapY = (Game1.p[0].boundingBox.halfHeight
              +  Game1.p[1].boundingBox.halfHeight)
              - (Game1.p[1].boundingBox.center.Y
              -  Game1.p[0].boundingBox.center.Y);

     if (Collision.testAABBAABBX(
           Game1.p[0].boundingBox, Game1.p[1].boundingBox) &&
         Collision.testAABBAABBY(
           Game1.p[0].boundingBox, Game1.p[1].boundingBox))
     {
         if (overlapX < overlapY) Position.X -= overlapX;
     }
 }

今、私がと衝突するとき、1p[1]overlapX読みposition.Xます-= 1。ただし、ここから問題が始まります。これがオーバーラップ中の画像です。黄色の縦線で示されているオーバーラップが実際にあることがわかります。

オーバーラップ

したがって、私の問題はposition.X、オーバーラップ値だけ後ろに移動するように指示した場合、少なくとも長方形を上または下に移動するまでは移動しないということです。私がそうすると、それは魔法のように自分自身を修正します:

重複なし

何が起こっているのかについての手がかりはありますか?多分それは私の目の前にあり、私はそれを見ていませんが、反応は次の動きの後にのみトリガーされるようです。

さらに情報が必要な場合はお知らせください。

4

1 に答える 1

0

これは、衝突解決コードがモーションコード内に配置されているために発生します。モーションコードは、移動しない限り実行されないようです。

解決策は、衝突解決コードをメソッドの外に移動して、すべてのフレームMoveによって呼び出される個別のメソッドに移動することです。Update

于 2013-01-14T03:53:06.863 に答える