2
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.
        }
  }
       
} 

編集:'Cells []'はPoint型の配列であり、noOfPartsはヘビが持っているセグメントの数です

主な質問

上記のコードで、tempXをheadXと比較しようとしていますが、エラーに対してある程度のマージンが必要です。たとえば、+-5ですが、これを実現する方法がわかりません。この背後にある理由は、おそらくxとY変数は数桁離れている可能性があるため、ヘビのセグメントの1つの半径がある場合(以下の代替の「ヘビ」の説明)、私が正しく、値が少しずれている場合でも、次のようになります。バックポジティブ。

また

誰かがこれを行うためのより良い方法を提案できるなら?基本的にはヘビゲーム用で、headXとheadYはヘビの頭で、Cellsの残りのX変数とY変数は体です。頭が体に当たるかどうかを比較しようとしています。

私はそれをテストしました、そしてそれはうまくいくように見えました、しかし私がそれを再びテストした後、私がヘビを数マスの間それ自身に二重に戻す場合にのみ衝突を拾うようです。たとえば、体を垂直に横切ると、衝突は検出されません。

また、ヘビが移動する各ブロックの後にこのメソッドが呼び出されることはかなり確信しています。

乾杯、シェーン。

PS睡眠がほとんどなく、血液中の糖分が多すぎる。上記があまり意味をなさないため、さらに明確にする必要がある場合は、私に知らせてください。

4

3 に答える 3

10
int eps = 5;
if (Math.abs(tempX - headX) <= eps && Math.abs(tempY - headY) <= eps) { 
    // ...
}
于 2012-11-04T16:13:20.843 に答える
3

2つのポイントがdelta互いにa内にあるかどうかを確認するには、それらの間の距離を計算します。次のように正方形を使用することで、平方根領域に入るのを避けることができます。

int distSq = (tempX-headX)*(tempX-headX) + (tempY-headY)*(tempY-headY);
int minDist = 5;
if (distSq < minDist*minDist) {
    // too close
}
于 2012-11-04T16:16:06.830 に答える
1

あなたのヘビがどのように見えるかはわかりませんが、それが複雑な形をしている場合、ヒットを探すことはスピードの点で高価になる可能性があります。簡単なテストを実行して、衝突が発生する可能性があるかどうかを確認できれば、衝突検出を高速化できます。これは、バウンディングボックスを使用して行うことができます。ヘビの体の最小および最大のxおよびy位置を追跡する必要があります。座標がこれらの境界内にある場合にのみ、ヘビの正確な形状を考慮に入れます。これをどのように行う必要があるかは、ヘビがどのように表現されているかによって異なります。スネークの輪郭がポリゴンで定義されている場合は、スネークが構成されている各タイルまたは各ピクセルを確認するか、座標がポリゴン内にあるかどうかを確認します。(ここではこれがどのように機能するかを説明するつもりはありませんが、少しググるとアルゴリズムが見つかります。)

別のポイント(ヘビの頭)までの距離を計算する必要がある場合は、これにさまざまなメトリックを使用できます。ゲーム内で水平方向と垂直方向の移動のみが可能な場合は、いわゆるマンハッタンまたはタクシーの距離を使用できますd = |x1-x0| + |y1-y0|。これは、x距離とy距離を追加することで構成されます。または、両方の距離の最大値を使用できますd = Max(|x1-x0|, |y1-y0|):( 2kayのアプローチに対応します)。

正確な距離が必要な場合は、ピタゴラスの公式を適用してください。距離と許容誤差を比較するために、平方根を計算する必要はありません。代わりに、距離の2乗と許容誤差の2乗を比較してください。これにより時間を節約できます。(x1-x0)^2 + (y1-y0)^2 < error_margin^2

于 2012-11-04T16:30:39.853 に答える