私はxnaでゲームを作成しました.衝突検出を取得するための良い方法を検索して検索しました. プレイヤーが上のタイルと衝突している場合、下への移動を停止する必要があります。プレイヤーが右に移動しようとしていて、そこにタイルがある場合は、移動させないでください。左に移動する場合はその逆です。良いものは何も見つかりませんでしたが、独自のものを思いつきました。これが衝突検出を行う良い方法なのか、それとも他の簡単な方法があるのか 誰にも教えてもらえますか?
public static class Collision
{
//Test to see if rect1 is colliding with rect2 on top
public static bool gravColliding(Rectangle rect1, Rectangle rect2)
{
if (rect1.Bottom >= rect2.Top && rect1.Top < rect2.Top && ((rect1.Left < rect2.Left && rect1.Right < rect2.Right && rect1.Right > rect2.Left && rect1.Bottom < rect2.Bottom) || (rect1.Right > rect2.Right && rect1.Left > rect2.Left && rect1.Left < rect2.Right && rect1.Bottom < rect2.Bottom) || (rect1.Left >= rect2.Left && rect1.Right <= rect2.Right) || (rect1.Left <= rect2.Left && rect1.Right >= rect2.Right)))
{
return true;
}
else
{
return false;
}
}
//Test to see if the right side of rect1 is colliding with rect2
public static bool rightSideCollide(Rectangle rect1, Rectangle rect2)
{
if ((rect1.Right >= rect2.Left && rect1.Left < rect2.Left && ((rect1.Top >= rect2.Top && rect1.Bottom <= rect2.Bottom) || (rect1.Top <= rect2.Top && rect1.Bottom >= rect2.Bottom) || (rect1.Top >= rect2.Top && rect1.Bottom >= rect2.Top && rect1.Top <= rect2.Bottom) || (rect1.Top <= rect2.Top && rect1.Bottom <= rect2.Bottom && rect1.Bottom >= rect2.Top))) && !(gravColliding(rect1, rect2)))
return true;
else
return false;
}
//Test to see if the left side of rect1 is colliding with rect2
public static bool leftSideCollide(Rectangle rect1, Rectangle rect2)
{
if ((rect1.Left <= rect2.Right && rect1.Right > rect2.Right && ((rect1.Top >= rect2.Top && rect1.Bottom <= rect2.Bottom) || (rect1.Top <= rect2.Top && rect1.Bottom >= rect2.Bottom) || (rect1.Top >= rect2.Top && rect1.Bottom >= rect2.Top && rect1.Top <= rect2.Bottom) || (rect1.Top <= rect2.Top && rect1.Bottom <= rect2.Bottom && rect1.Bottom >= rect2.Top))) && !(gravColliding(rect1, rect2)))
return true;
else
return false;
}
}
私はこれをテストして動作しましたが、効率的かどうかはわかりません。また、優れたプログラマーであることは、物事を機能させるだけでなく、効率的にすることであることも知っています. 本当に長く非効率的な方法でそれを行った場合、からかわないでください。私はまだ学んでいます。ありがとう、助けていただければ幸いです。