public void checkForCollision () {
int headX = cells[0].x;
int headY = cells[0].y;
int noOfParts = nPoints;
for(int i = 1; i <noOfParts;i++)
{
int tempX = cells[i].x;
int tempY = cells[i].y;
if(tempX == headX && tempY == headY){
JOptionPane.showMessageDialog(null,"Head hit body");
//EndGameCollectScore etc.
}
}
}
编辑:'cellis []'是类型点的数组,NooFparts就是蛇具有多少个段
主要问题
使用上述代码,我试图将TEMPX与HeadX进行比较,但我想为错误提供一种差距,例如 -5,但不确定如何实现这一目标,我的理由是我认为x和y变量可能是分开的几位数字,因此,如果我有蛇的一部分的半径(解释'蛇'在下面的替代),然后如果我正确并且值有一点,那么它仍然应该恢复正面。
或
替代
如果有人可以提出一种更好的方法来做到这一点?基本上,这是一个蛇游戏,headx和Heady是蛇的头部,而细胞中剩余的X和Y变量是身体,我正在尝试比较头部是否击中身体。
我对其进行了测试,它似乎可以工作,但是在我再次测试后,似乎只有在我将蛇重新放回几个正方形的情况下,才会碰到碰撞。例如如果我越过垂直的身体,它将无法检测到碰撞。
我也可以肯定,在每个障碍物移动后都调用此方法。
欢呼,Shane。
P.S在我的血液中很少的睡眠和过多的糖分运行,如果您需要进一步澄清,因为上面没有很多有意义的事。
int eps = 5;
if (Math.abs(tempX - headX) <= eps && Math.abs(tempY - headY) <= eps) {
// ...
}
检查是否彼此检查两个点是否在delta
之内,请计算它们之间的距离。您可以避免使用正方形进入平方根区域,例如:
int distSq = (tempX-headX)*(tempX-headX) + (tempY-headY)*(tempY-headY);
int minDist = 5;
if (distSq < minDist*minDist) {
// too close
}
我不知道您的蛇看起来如何,但是如果它具有复杂的形状,那么寻找命中率可能很昂贵。您可以加快碰撞检测,如果您可以进行快速测试,以查看是否可能发生碰撞。您可以使用边界框来执行此操作。您必须跟踪蛇形的最小和最大X和Y位置。只有当一个坐标位于这些边界内时,您才会考虑蛇的确切形状。必须如何完成此操作取决于蛇的表示。检查每个图块或每个像素。蛇是由蛇制成的,或者可能检查坐标是否在多边形内,是否由多边形定义。(我不会在这里解释它的工作原理,但是如果您有点谷歌,您会发现算法。)
如果您需要计算到另一点(蛇头)的距离,则可以为此使用不同的指标。如果在游戏中只能进行水平和垂直运动,则可以使用所谓的曼哈顿或出租车距离:d = |x1-x0| + |y1-y0|
。它包括添加x和y距离,或者您可以使用两个距离的最大值: d = Max(|x1-x0|, |y1-y0|)
(correponds到2kay的方法)。
如果您需要确切的距离,请应用毕达哥拉斯公式。为了将距离与误差边距进行比较,您无需计算平方根。而是将距离的正方形与误差边距的平方进行比较。这节省了时间。(x1-x0)^2 + (y1-y0)^2 < error_margin^2
。