使用矩形时的碰撞检测

时间:2013-08-14 12:24:25

标签: java collision-detection game-physics rectangles intersect

所以我明白我现在不是以最好的方式编码;这是一种试运行。我正在尝试做的是使用矩形和交叉属性的墙碰撞(抱歉,如果我没有使用正确的术语)。到目前为止,我在屏幕上有2个矩形。 1播放器控制,另一个播放器正在与之碰撞。当他们碰撞时,玩家停止移动。问题是如果玩家在他们已经碰撞时试图进入矩形,则玩家不能在垂直于移动的任何方向上移动,即如果玩家握住右箭头键移动到矩形中,那么他们不能上下移动。游戏的前提是,如果您的x或y坐标无效,那么您将被移回到记录的最后一个有效坐标,但我无法分别检测有效的x和y坐标。这是代码:

public void Collision() 
{

    if(x < 0)
        x = 0;

    if(x > 400 - width)
        x = 400 - width;

    if(y < 0)
        y = 0;

    if(y > 300 - height)
        y = 300 - height;


    rect1 = new Rectangle(x, y, 16, 16);
    rect2 = new Rectangle(sx, sy, wid, hei);

    if(!rect1.intersects(rect2))
    {
        validX = true;
        validY = true;
    }
    else
    {
        validX = false;
        validY = false;
    }


    if(validX)
    {
        lastValidX = x;
    }

    if(validY)
    {
        lastValidY = y;
    }

    if(!validX)
    {
        x = lastValidX;
    }

    if(!validY)
    {
        y = lastValidY;
    }

}

Guy类中的Collision()方法是我遇到麻烦的地方。是的,我的代码现在非常混乱,但这只是一个测试。

谢谢大卫。

1 个答案:

答案 0 :(得分:1)

你可以通过在这里做额外的逻辑来实现你所描述的内容(例如,当一个是假而另一个是真的时检测案例):

if(!rect1.intersects(rect2))
{
    validX = true;
    validY = true;
}
else
{
    validX = false;
    validY = false;
}

然而,似乎你不应该让矩形首先处于“碰撞”状态。例如,您可以更改Move方法以执行类似

的操作
public void Move()
{
    int oldX = x, oldY = y;
    x += dx;
    y += dy;
    if (Collision()) {
        x = oldX;
        y = oldY;
    }
}