私はブレークアウト/レンガブレーカー/アルカノイドクローン(opengl-es /アンドロイド)を作っています。私はかなり長い間、私の衝突検出コードに固執しています。タイトルが示唆しているように:どのようにレンガの側面がボールに当たったのか分かりますか?
ある方向(xまたはy)で速度を逆転させる必要があるだけなので、レンガが当たったとき、私は考えることができます:
if(speedY < 0) : left, upper or right
else : left, bottom or right
if(speedX < 0) : bottom, right or upper
else : bottom, left or upper
しかし、これは私が垂直または水平に衝突したかどうかを決定することには至りません。
私はインターネット上のいくつかのコード例を見てきましたが、それらはしばしば非常にあいまいで、複雑で、私にとっては話題にはなりません。
あなたがレンガの位置とボールの位置を知っていれば、各オブジェクトのテストを行い、レンガの側面を判断することができます。
左上の標準Java起源を仮定します:
+----+
( )| |
+----+
If the ball's Max-X is < the Min-X of the brick, you know that it has to be on the left side, and vice versa with the right and left. You would also test the Y
values for top and bottom collisions.
もちろん、これは衝突検出が最初に機能していることを前提としています。
編集
これはCollisionエンジンの抜粋ですが、これはほんの少しの例ですが、オブジェクトが衝突しているオブジェクトの左側にあるかどうかをテストする方法です。
else if ((oCenter.getX() < sCenter.getX())
&& ((oCenter.getY() < (sCenter.getY() + sourceHalfHeight))
&& (oCenter.getY() > (sCenter.getY() - sourceHalfHeight))))
return LEFT;
ここの例では、 oCenter
は Point2D
で、ボールの中心です。 sCenter
は Point2D
で、長方形の中心です。 sourceHalfHeight
は、長方形の高さの半分です(中心点 sCenter
のオブジェクト)。
擬似コードアルゴリズム:
if (the center X of the ball < the center X of the rectangle
AND the center Y of the ball is BETWEEN the max Y and min Y of the rectangle)
then the ball is to the LEFT of the rectangle
end if