2D垂直/水平碰撞检测

时间:2013-10-10 23:52:28

标签: java 2d collision-detection

我正在用Java编写2D平台游戏,但我遇到了一个问题。我有两个对象:两个都有边界框,四个坐标代表方框的角落。

我的问题是我正试图找到一种模拟碰撞的方法,但我似乎无法做到。我已经尝试过遍地搜索,但大多数网站都只展示了OpenGL策略。

让我们像这样表示边界框坐标:

TL:左上角
TR:右上角
BL:左下左侧 BR:右下角

以下是我最初提出的测试碰撞的方法:

if(TL1 > TL2 && TL1 < TR2) //X-axis
    //Collision happened, TL1 corner is inside of second object
else if(BL1 < TL2 && BL1 > BL2) //Y-axis
    //Collision happened, BL1 corner is inside of second object

这是展示它的一种非常粗糙的方式,但基本上我正在检查一个角是否与另一个对象相交。问题是,它没有考虑到两个轴。也就是说,即使一个对象位于另一个对象之上,也会发生x碰撞。

如果我检查两个轴上的碰撞,那么就无法确定它是水平碰撞还是垂直碰撞。或者也许有,我还没想出来。

有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:1)

这是来自java.awt.Rectangle。

你应该能够修改它以适应你的坐标。

/**
 * Determines whether or not this <code>Rectangle</code> and the specified
 * <code>Rectangle</code> intersect. Two rectangles intersect if
 * their intersection is nonempty.
 *
 * @param r the specified <code>Rectangle</code>
 * @return    <code>true</code> if the specified <code>Rectangle</code>
 *            and this <code>Rectangle</code> intersect;
 *            <code>false</code> otherwise.
 */
public boolean intersects(Rectangle r) {
    int tw = this.width;
    int th = this.height;
    int rw = r.width;
    int rh = r.height;
    if (rw <= 0 || rh <= 0 || tw <= 0 || th <= 0) {
        return false;
    }
    int tx = this.x;
    int ty = this.y;
    int rx = r.x;
    int ry = r.y;
    rw += rx;
    rh += ry;
    tw += tx;
    th += ty;
    //      overflow || intersect
    return ((rw < rx || rw > tx) &&
            (rh < ry || rh > ty) &&
            (tw < tx || tw > rx) &&
            (th < ty || th > ry));
}