我正在Java中实现一些相当直接的2D碰撞检测,我对如何确定碰撞具有哪个 surface (或命中框的一侧)有点绊倒了发生在。
我已经浏览了这个网站上的问题,并在其他地方尝试了广泛的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轴上的场中较低),我不知道使用这种方法是从左边还是从底部发生了碰撞。
有没有人知道这方面的解决方案,甚至只是一个不同的实现?
我看到速度和方向信息如何成为一种好处(如果对象一次只能在一个维度上移动,甚至是解决方案)。但是,如果对象可以对角移动,我看不出如何逃避同样的问题。
答案 0 :(得分:1)
您需要的参数多于矩形,因为矩形只有位置和大小信息。如果矩形发生碰撞,其中至少有一个必须移动,但您不会传入任何速度数据。也许尝试子类化Rectange:
public class MovingRectange extends Rectangle {
int xVelocity;
int yVelocity;
//etc
}
然后将MovingRectange实例传递给getCollisionSide ...
答案 1 :(得分:0)
正如其他答案所指出的那样,您需要更多参数才能获得这条信息。
你可以通过多种方式解决这个问题,我假设这两个三角形是可移动的(或至少其中一个)并且它们具有恒定的大小。在这种情况下,您可以例如在三角形的最后5-10个最后位置保存一个队列,并能够跟踪其移动。 您可以简单和抽象,甚至将该队列保存在矩形类中。
另一种不需要保存先前位置的解决方案是更频繁地检查位置(或设置触发器以在发生位置变化时通知您)并限制矩形仅以小步长移动。如果您的触发器包含如下触发器 rectMoved(rectangleId,newPosition)然后你可以很容易地知道哪个矩形撞到另一个,从哪一侧
干杯