ブレイクアウト衝突:衝突の側面の検出


10

私はブレイクアウトクローン(私の最初のゲーム)を書いていて、レンガのどちら側がヒットしたかを理解する方法について完全に行き詰まっています。

私はこのような衝突検出方法を持っています:

DetectCollision(Object a, Object b)

   x = distance(a.x, b.x);
   y = distance(a.y, b.y);

   if (x is smaller than the combined width &  y is smaller is than combined height {
       return true;
   }
return false;  

これはまったく問題なく動作しますが、適切に応答するためには、衝突の側面と、中心からの相対的な位置を知る必要があります。

私は過去数日間を振り回して過ごしましたが、道に迷っています。

回答:


13

これはすべて、衝突したレンガの位置に対するボールの位置から収集できます。

衝突を検出したら:

if(ballPosition.y <= brickPosition.y - (brickHeight/2))
  //Hit was from below the brick

if(ballPosition.y >= brickPosition.y + (brickHeight/2))
  //Hit was from above the brick

if(ballPostion.x < brickPosition.x)
  //Hit was on left

if(ballPostion.x > brickPosition.x)
  //Hit was on right

最初の2つは、ボールがレンガの上か下かを確認します。どちらもレンガの隣にある必要がない場合は、どちら側にあるかを確認してください。これは、場所を取得する場所に合わせて調整する必要があります。つまり、brickPositionはブリックの中心、brickPositionは左上隅です。


1
しかし、これを使用してプレーヤーを再配置するにはどうすればよいですか?プレーヤーがレンガの内側に移動するので、これらの条件の複数が満たされ、必要なxを壁の端にリセットした場合(たとえば、キーを押した場合)レンガの目的のxを壁のすぐ隣に設定すると、キャラクターの理論上の位置をチェックして、どの方向から衝突しているかを確認すると、これらの条件の複数が満たされるため、実際には機能しません。これを使用してプレーヤーをリセットしますが、ifの最後にelseを追加する必要がありますか?)
bluejayke

私が知る限り、ブレイクアウトタイプのゲームの「プレーヤー」はパドルです。パドルはレンガの内側を移動していません。また、ボールとレンガの相互作用に基づいてパドルの位置を変更していません。それがあなたがやっていることなら、追加のロジックは必要ありません。すべての衝突チェックが完了するまで、再配置を処理しないでください。または、いずれかのチェックが真になったときに戻ります。
MichaelHouse

8

ベクター数学を使用して、それらの間の角度を発見できます!

ここに短い答えがあります:

ballToBrick = ballPosition - brickPosition;
ballToBrick.Normalize();
brickFacing = Vector2(0,1).Normalize();


float angle = acos( Dot(ballToBrick, brickFacing) );

ブリックフェーシングはトリッキーなベクトルで、角度計算の「開始点」です。ベクトルを上向きにしたい場合は、ベクトルを(0、1)、左向き(-1、0)、右向き(1、0)、下向き(0、-1)にします。あなたがOpenGL軸にいると仮定します。ここで、upとrightは正です。

わからない場合は、使用する各関数の定義を次に示します。

Vector2.Normalize()
{
    float length = squareroot(x * x + y * y);
    x = x / length;
    y = y / length;
    return this;
}

Dot(Vector2 a, Vector2 b)
{
    return a.x * b.x + a.y * b.y;
}

https://en.wikipedia.org/wiki/Dot_product

リファレンス:http : //blog.wolfire.com/2009/07/linear-algebra-for-game-developers-part-2/

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.