【发布时间】: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