Java 使用布尔数组进行碰撞检测?

Java 使用布尔数组进行碰撞检测?,java,collision-detection,slick2d,Java,Collision Detection,Slick2d,我目前正试图为2D游戏编写一种碰撞检测方法,但我被卡住了 交叉法由经过敌人的玩家调用,玩家和敌人的坐标。ImageMask对象具有与精灵的遮罩相对应的二维布尔数组。面具被缩放4倍,因为精灵是16x16,在游戏中被放大到64x64 public boolean intersects(ImageMask other, int tx, int ty, int ox, int oy) { boolean[][] otherMask = other.getMask(); if ((tx+m

我目前正试图为2D游戏编写一种碰撞检测方法,但我被卡住了

交叉法由经过敌人的玩家调用,玩家和敌人的坐标。ImageMask对象具有与精灵的遮罩相对应的二维布尔数组。面具被缩放4倍,因为精灵是16x16,在游戏中被放大到64x64

public boolean intersects(ImageMask other, int tx, int ty, int ox, int oy) {
    boolean[][] otherMask = other.getMask();
    if ((tx+mask.length*4<ox)         // This checks if the sprites
            || ty+mask[0].length*4<oy // aren't close to each other.
            || ox+otherMask.length*4<tx
            || oy+otherMask[0].length*4<ty)
        return false;

    //This stuff isn't working.
    for (int i=0;i<mask.length;i++) {
        for (int j=0;j<mask[i].length;j++) {
            for (int k=0;k<otherMask.length;k++) {
                for (int l=0;l<otherMask[k].length;l++) {
                    if ((tx+i*4)<=(ox+k*4) && (tx+i*4+4)>=(ox+k*4)
                            && (ty+j*4)<=(oy+l*4) && (ty+j*4+4)>=(oy+l*4+2)
                            && mask[i][j] && otherMask[k][l]) {
                        return true;
                    }
                }
            }
        }
    }
    return false;
}

这不是很有效;有时,它会按预期工作,但有时,当实体不接触时,它会报告冲突,或者当实体彼此重叠时,它会报告冲突。如何解决此问题以使碰撞检测工作?

if语句应为

if ((tx+i*4)<=(ox+k*4+4) && (tx+i*4+4)>=(ox+k*4)
        && (ty+j*4)<=(oy+l*4+4) && (ty+j*4+4)>=(oy+l*4+2)
        && mask[i][j] && otherMask[k][l])

另外,看看项目的其余部分,在初始化ImageMask时,你把x和y搞糟了。

我不完全确定这里发生了什么,但四重嵌套for循环很可能会成为一个问题。我对它进行了优化,但后来它不起作用,所以我对它进行了简化。for循环在两个数组xD中迭代每个布尔值。@MadisonMay那你怎么做?@MadisonMay我认为嵌套循环不是问题。他们可能看起来很吓人,但实际上,很容易看到他们,并看到他们是正确的。唯一真正的替代方法是使用递归函数,但它自身的复杂性使其难以读取。问题可能在于复杂的IF语句,而不是循环。要么是这样,要么他首先传入了错误的值。@AnubianNoob我建议使用一些单元测试来验证您的IF语句逻辑。画出一组重叠场景,然后为每个场景设置单元测试,忽略循环部分。只需静态定义您的tx、ox等。。。变量来匹配特定的边界条件,并确保它们为您提供预期的答案。事实上,我建议将intersects方法重构为一个或两个以上的方法。特别是那个if语句。将其分解为自己的静态函数或方法,以便简化变量以提高可读性。