0

私はArduinoでシューティングゲームを書いていて、AABB衝突検出を使用しています-

ref:バウンディング ボックスの衝突検出

私の問題は、オブジェクトが互いに衝突する時間にあります。現在、2 つのオブジェクトが交差する期間に当てはまる基本的なトリガーを使用しています。私が必要としているのは、「パルス長」(または交差時間) に関係なく、1 つのカウントのみが検出されるパルス カウントの問題によって最もよく説明されると思います。 ここに画像の説明を入力

これを C++ で実装するにはどうすればよいですか? 私が現在使用している機能:

bool CollisionTest( xPlayer, yPlayer, xAlien, yAlien, width, height)
{
  if( ((xPlayer+width) >= xAlien)  && (xPlayer <= (xAlien+width))  &&
      ((yPlayer+height) >= yAlien) && (yPlayer <= (yAlien+height)) )
    return true;
  else
    return false;
}
4

2 に答える 2

1

エッジ検出器が必要です!

bool collision = false;
int pulses = 0;

//For each frame..
if(!collision && CollisionTest(....)) {
    pulses++;
}
collision = CollisionTest(....);

なぜそれらを数える必要があるのか​​ わかりませんが、これで十分です。

于 2013-12-31T00:34:03.723 に答える
0

では、リーディングエッジだけをキャッチしたいですか?現在の値を以前の値と比較する必要があること以上に特に賢明なことはありません。

おそらく、より広いデータ形式に依存します。

オブジェクトを位置と速度として保存し、フレームごとに速度を追加するだけの場合 (基本的にオイラー統合)、位置ごとのオーバーラップはなく、位置ごと + 速度の場合はいつでも衝突をトリガーできます。速度を明示的に保存していなくても、他の方法で提供できる場合でも、これは潜在的な答えです。

同様に、現在の位置と最後の位置を保存している場合 (たとえば、Verlet 統合の場合)、そのように 2 つのテストを実行できます。

前のフレームの結果を保存して現在のフレームと比較するための便利な構造がある場合は、それもオプションです。メモリまたはキャッシュの予算が限られている場合std::map、a によってインデックス付けされたstd::pairものはやり過ぎかもしれませんが、特別なゲームがある場合は、利用できる特定の知識があれば、オプションを帳消しにする必要はないかもしれません。

于 2013-12-31T00:31:37.800 に答える