XNA 2D平铺碰撞代码效率

时间:2013-09-12 04:27:47

标签: c# xna

我在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;
    }
}

我对此进行了测试并且它有效,但我不知道它是否有效 - 而且我知道成为一名优秀的程序员不仅仅是让事情发挥作用,而是让它变得高效。如果我以一种非常漫长而无效的方式做到这一点,请不要取笑,我还在学习。谢谢,感谢帮助,谢谢。

1 个答案:

答案 0 :(得分:0)

rectangle.intersects(矩形)更好一些,检查每一面你只需要远离主矩形四个偏移矩形并检查它们是否与另一个矩形相交