0

我一直在阅读有关 AABB 碰撞的信息。我目前有一个相当粗略的实现。我现在能够检测到两个矩形何时在 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;
     }
 }

现在,当我与 碰撞时p[1]overlapX显示为 1。所以position.X应该-= 1。然而,问题就从这里开始了。这是重叠期间的图像。您可以看到确实存在由垂直黄线显示的重叠:

重叠

所以我的问题是,当我指示position.X按重叠值向后移动时,它不会,至少在我向上或向下移动矩形之前不会。如果我这样做,它会神奇地自我纠正:

无重叠

关于发生了什么的任何线索?也许它就在我面前而我没有看到它,但反应似乎只在下一个动作之后触发。

如果需要更多信息,请告诉我。

4

1 回答 1

0

发生这种情况是因为您的碰撞解决代码被放置在您的运动代码中,除非您采取行动,否则它似乎不会运行。

解决方案是将您的冲突解决代码移到您的Move方法之外的一个单独的方法中,该方法由Update每一帧调用。

于 2013-01-14T03:53:06.863 回答