Java - 检查ArrayList中多个矩形之间的聚合

时间:2016-05-20 22:30:15

标签: java arraylist collision-detection slick2d

在搜索了大量网站(包括此网站)之后,我遇到的每个解决方案似乎都无效,或者只处理列表中的第一个对象。

问题

Slick2Ds Rectangle类提供了许多不同的碰撞方法,一种是intersects(Rectangle box);方法,可以在将此类与ArrayList类中构建的javas结合使用时正确检测冲突。我遇到的问题是只检测到列表中的第一个对象并正确地碰撞。

以下代码处理冲突:

public void move(float x, float y) {
    if (blocks.size() > 0) {
        for (int i = 0; i < blocks.size(); i++) {
            Rectangle r = blocks.get(i);
            Rectangle p = new Rectangle(xx + x, yy + y, 32, 32);
            if (!r.intersects(p)) {
                xp = xx;
                yp = yy;
                xx += x;
                yy += y;
                break;
            } else {
                xx = xp;
                yy = yp;
                xx += 0;
                yy += 0;
                System.out.println("Collide" + new Date());
                break;
            }
        }
    }else{
        xp = xx;
        yp = yy;
        xx += x;
        yy += y;
    }
}

键:xx =播放器x; yy =玩家y; xp =玩家最后x位置; yp =玩家最后y位置; r =迭代列表中的当前矩形; p =预先计算出玩家的下一个位置

这个基本代码的工作是通过模拟一个矩形来添加动作,该矩形将位于玩家的下一个位置。如果它没有碰撞,那么玩家就不会碰撞而且我们可以移动,但是如果它确实发生碰撞,那么我们就不会移动玩家,因为下一个位置没有打开。

但代码有一个缺陷,因为在迭代过程中的某些时刻只有第一个框可以工作,其他人确实检测到了碰撞,但没有停止框。

Correct Collision; logged in the console to confirm

Incorrect Collision; not logged in the console, even though its another instance of the same object

2 个答案:

答案 0 :(得分:0)

尝试删除所有休息时间。 因为如果它找到了交叉点,它就会突破循环。

答案 1 :(得分:0)

使用时会发生什么:

public void move(float x, float y) {

    boolean intersectedBlock = false;

    for (int i = 0; i < blocks.size(); i++) {
        Rectangle r = blocks.get(i);
        Rectangle p = new Rectangle(xx + x, yy + y, 32, 32);

        if (r.intersects(p)) {
            intersectedBlock = true;
            break;
        }
    }

    if (intersectedBlock) {
        xx = xp;
        yy = yp;
        xx += 0;
        yy += 0;
        System.out.println("Collide" + new Date());
    } else {
        xp = xx;
        yp = yy;
        xx += x;
        yy += y;
    }
}