我在 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;
}
}
我对此进行了测试并且它有效,但我不知道它是否有效——而且我知道成为一名优秀的程序员不仅仅是让事情正常工作,而是让它变得高效。如果我这样做的方式非常漫长且效率低下,请不要取笑,我仍在学习。谢谢,感谢帮助,谢谢。