2 つのオブジェクト間で発生する可能性のあるすべての衝突を処理するための適切な方法を作成しようとしています。通常、一方が移動して他方にぶつかり、「跳ね返る」必要があります。
これまでに行ったこと (ボードがあり、レンガでボールをバウンドさせる典型的なゲームを作成しています) は、長方形が交差するかどうかを確認し、交差する場合は Y 速度を反転させることです。
これは非常に醜い一時的な解決策であり、長期的には機能しません。これはゲームでは非常に一般的な処理であるため、将来のプロジェクトでもこれを行うための優れた方法を見つけたいと思っています. リンクや役立つ情報は大歓迎です。
以下は、私の衝突処理関数が現在どのように見えるかです。
protected void collision()
{
#region Boundaries
if (bal.position.X + bal.velocity.X >= viewportRect.Width ||
bal.position.X + bal.velocity.X <= 0)
{
bal.velocity.X *= -1;
}
if (bal.position.Y + bal.velocity.Y <= 0)
{
bal.velocity.Y *= -1;
}
#endregion
bal.rect = new Rectangle((int)bal.position.X+(int)bal.velocity.X-bal.sprite.Width/2, (int)bal.position.Y-bal.sprite.Height/2+(int)bal.velocity.Y, bal.sprite.Width, bal.sprite.Height);
player.rect = new Rectangle((int)player.position.X-player.sprite.Width/2, (int)player.position.Y-player.sprite.Height/2, player.sprite.Width, player.sprite.Height);
if (bal.rect.Intersects(player.rect))
{
bal.position.Y = player.position.Y - player.sprite.Height / 2 - bal.sprite.Height / 2;
if (player.position.X != player.prevPos.X)
{
bal.velocity.X -= (player.prevPos.X - player.position.X) / 2;
}
bal.velocity.Y *= -1;
}
foreach (Brick b in brickArray.list)
{
b.rect.X = Convert.ToInt32(b.position.X-b.sprite.Width/2);
b.rect.Y = Convert.ToInt32(b.position.Y-b.sprite.Height/2);
if (bal.rect.Intersects(b.rect))
{
b.recieveHit();
bal.velocity.Y *= -1;
}
}
brickArray.removeDead();
}