XNA 2D 图块碰撞代码效率

本文关键字:代码 效率 碰撞 2D XNA | 更新日期: 2023-09-27 18:30:57

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

我测试了这个,它有效,但我不知道它是否有效 - 我知道成为一名优秀的程序员不仅仅是让事情工作,而是让它高效。 如果我做的非常漫长且效率低下,请不要取笑,我还在学习。 谢谢,感谢帮助,谢谢。

XNA 2D 图块碰撞代码效率

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