繁体   English   中英

Java-检查ArrayList中多个矩形之间的冲突

[英]Java - Checking Colisions Between Multiple Rectangles in an ArrayList

在搜索了包括该站点在内的大量站点之后,我遇到的每个解决方案似乎都不起作用,或者仅对列表中的第一个对象起作用。

问题

Slick2Ds Rectangle类提供了许多不同的碰撞方法,一种是intersects(Rectangle box);另一种是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 =预先计算出的玩家下一个位置

此基本代码工作是通过模拟将位于玩家下一个位置的矩形来增加移动。 如果它不发生碰撞,那么玩家将不会发生冲突并且我们可以移动,但是如果它发生了冲突,那么我们将不会移动玩家,因为下一个位置未打开。

但是该代码有一个缺陷,因为在迭代过程中的某些时候,只有第一个盒子可以工作,其他的确实可以检测到碰撞,但不会停止盒子。

正确的碰撞; 登录控制台以确认

碰撞不正确; 没有登录到控制台,即使它是同一对象的另一个实例

尝试删除所有中断。 因为如果找到相交,它将脱离循环。

如果使用,会发生什么:

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;
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM