0

我在 Java 中实现了一些相当简单的 2D 碰撞检测,我对如何确定碰撞发生在哪个表面(或碰撞框的一侧)有点困惑。

我浏览了这个网站上的问题,并在其他地方尝试了广泛的 Google-fu,最接近我的是这样的:

public Side getCollisionSide(Rectangle main, Rectangle incoming) {
    boolean toTheLeft = main.getX() - incoming.getX() < 0;
    boolean toTheTop = main.getY() - incoming.getY() < 0;
    // ...but what can I do from here?
}

问题是这实际上并没有给出与哪一方相撞。它可以告诉我碰撞发生在哪个象限,在原点设置为main' 坐标的网格中。但是如果一个物体main从左侧撞击(并且恰好在 Y 轴上的区域中较低),我无法使用这种方法知道碰撞是从左侧还是从底部发生的。

有谁知道这个的解决方案,甚至只是一个不同的实现?

我看到拥有速度和方向信息是如何带来好处的(甚至是一种解决方案,如果对象一次只能通过一个维度)。但是,如果对象可以对角移动,我看不出如何逃避同样的问题。

4

2 回答 2

1

您需要的参数不仅仅是矩形,因为矩形只有位置和大小信息。如果矩形发生碰撞,则其中至少有一个必须在移动,但您不传递任何速度数据。也许尝试子类化矩形:

public class MovingRectange extends Rectangle {

  int xVelocity;
  int yVelocity;

  //etc
}

然后将 MovingRectange 实例传递给 getCollisionSide ...

于 2013-02-25T15:31:36.463 回答
0

正如另一个答案指出的那样,您需要更多参数来获取该信息。

您可以通过多种方式解决此问题,我假设这两个三角形是可移动的(或至少其中一个)并且它们具有恒定的大小。在这种情况下,您可以例如将三角形的最后 5-10 个位置保存在队列中,并能够跟踪其移动。为了简单和抽象,您甚至可以将该队列保存在矩形类中。

另一个不需要保存先前位置的解决方案是更频繁地检查位置(或设置触发器以在发生位置更改时通知您)并限制矩形仅以小步长移动。如果您的触发器包含触发器,例如: rectMoved(rectangleId, newPosition) 那么您可以轻松知道哪个矩形撞到另一个矩形以及从哪一侧

干杯

于 2013-02-25T15:43:38.067 回答