0

私は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;
    }
}

私はこれをテストして動作しましたが、効率的かどうかはわかりません。また、優れたプログラマーであることは、物事を機能させるだけでなく、効率的にすることであることも知っています. 本当に長く非効率的な方法でそれを行った場合、からかわないでください。私はまだ学んでいます。ありがとう、助けていただければ幸いです。

4

1 に答える 1

0

rectangle.intersects(rectangle)の方がはるかに優れており、各側を確認するには、メインの四角形から離れた4つのオフセット四角形を作成し、それらが別の四角形と交差するかどうかを確認します

于 2013-12-13T20:01:57.727 に答える