シンプルな BreakOut ゲーム (垂直、下に沿ってパドル) を起動して実行していますが、衝突検出が少しずれています。Rectangle.Intersect を使用して、最初にボールが特定のレンガと交差するかどうかを確認し、さらに 4 つの Intersect 呼び出しがある場合は、ボールが垂直 (レンガの側面、左 + 右) または水平 (レンガの上部+下部)。場合によっては、水平方向に隣接する 2 つのレンガの交点付近でボールが鋭角にレンガに衝突すると、両方のレンガが取り除かれ、上方向に進みます。これは衝突の二重化であると思います。四角形が見つかった瞬間に交差するかどうかをチェックする foreach ループを強制的に終了しましたが、これは問題を解決していません。
これは、ゲーム クラスのメインの Update() 関数にあります。
foreach (Brick brick in bricks)
{
if (brick.CheckCollision(ball))
{
break;
}
}
これは Brick.CheckCollision() 関数です:
public bool CheckCollision(Ball ball)
{
if (alive && ball.Bounds.Intersects(location))
{
alive=false;
ball.Deflection(this);
return true;
}
return false;
}
これが Ball.Deflection() 関数です。これでは、幅/高さのない長方形を使用してレンガの側面をマークしています。それが正しい方法かどうかわからない:
public void Deflection(Brick brick)
{
//For vertical collision (top or bottom of brick) invert Y motion
if (this.Bounds.Intersects(new Rectangle(brick.Location.Left, brick.Location.Top, brick.Location.Right - brick.Location.Left, 0)) ||
this.Bounds.Intersects(new Rectangle(brick.Location.Left, brick.Location.Bottom, brick.Location.Right - brick.Location.Left, 0)))
{
motion.Y *= -1;
return;
}
//For horizontal collision (left or right side of brick) invert X motion
if (this.Bounds.Intersects(new Rectangle(brick.Location.Left, brick.Location.Top, 0, brick.Location.Bottom - brick.Location.Top)) ||
this.Bounds.Intersects(new Rectangle(brick.Location.Right, brick.Location.Top, 0, brick.Location.Bottom - brick.Location.Top)))
{
motion.X *= -1;
return;
}
}
私はあからさまに明白な論理エラーを犯していると思いますが、一般的なアプローチを改善できるなら、私はすべての耳です!