比较两个INT变量与房间/边距的错误


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

相关内容

  • 没有找到相关文章

最新更新