回答:
これは、オブジェクトが壁に入り込んで衝突が見つかったら、速度をゼロに設定してオブジェクトの動きを停止するだけで、オブジェクトはまだその壁内にあるためです。
これを修正するには、オブジェクトを移動して衝突を解決する必要があります。ここには2つのオプションがあります。
2番目のオプションの実装
ここでは、速度がオブジェクトの移動方向を表していると仮定します(基本的に、オブジェクトの位置変更と衝突チェックの間の速度は変更しないことに注意してください)。また、原点が画像の左上にあると仮定します(したがって、オブジェクトを移動して衝突を解決する場合は、左上隅を配置します)。
ここに私がする方法があります:
if (objRect.Intersects(wallRect)) // If there is a collision
{
Vector2 newPos = obj.Position;
if (obj.Velocity.X > 0) // object came from the left
newPos.X = wallRect.Left - objRect.Width;
else if (obj.Velocity.X < 0) // object came from the right
newPos.X = wallRect.Right;
if (obj.Velocity.Y > 0) // object came from the top
newPos.Y = wallRect.Top - objRect.Height;
else if (obj.Velocity.Y < 0) // object came from the bottom
newPos.Y = wallRect.Bottom;
obj.Position = newPos;
}
古いオブジェクトの位置を使用してオブジェクトがどこから来たかを見つけることもできますが、この場合は速度を使用する方が簡単です。