【问题标题】:Collision detection using boolean arrays?使用布尔数组进行碰撞检测?
【发布时间】:2014-01-01 19:23:12
【问题描述】:

我目前正在尝试为 2D 游戏编写碰撞检测方法,但我卡住了。

intersects() 方法由玩家通过敌人调用,以及玩家和敌人的坐标。 ImageMask 对象有一个二维布尔数组,对应于精灵的掩码。由于精灵是 16x16 并在游戏中放大到 64x64,因此蒙版被缩放了 4 倍。

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

这不是很好;有时它会按预期工作,但有时它会在实体不接触时报告碰撞,或者在实体彼此重叠时报告碰撞。我应该如何解决这个问题才能使碰撞检测工作?

【问题讨论】:

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

标签: java collision-detection slick2d


【解决方案1】:

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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-27
    • 1970-01-01
    • 2010-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    相关资源
    最近更新 更多