没有最大速度的xna碰撞

时间:2014-05-01 01:07:35

标签: c# xna 2d collision

我制作了一款平台游戏,并且我已经研究了在基于游戏的游戏中添加碰撞的不同方法,而无需轮换。但是我所看到的一切都假设在碰撞被检测到之前,其中一个碰撞对象在任何情况下都不会足够快地通过另一个。我尝试过使用Box2D和Farseer,但是在制作大量瓷砖时,它们过于复杂并且运行速度很慢。我也尝试使用自己的方法使用2D凸包,但运行速度太慢。那么有没有办法在没有最大速度的情况下检测碰撞,或让物品彼此通过而不是复杂的并且可以使用大量的瓷砖?非常感谢任何帮助

2 个答案:

答案 0 :(得分:0)

您可以尝试使用双算法方法,首先使用简单算法确定对象是否可能发生碰撞,如果是,请使用复杂算法查看它们是否发生碰撞。

答案 1 :(得分:0)

取决于物体及其运动和整个游戏玩法。如果你正在向一些障碍物射击子弹,你可以计算子弹在击中它之前是否会与障碍物相交。你有位置,你可以计算它们之间的距离。所以你可以检查碰撞和距离。

其他方式,正如 @cwohlman 建议的那样。你可以有2个碰撞盒,一个大的“假定”碰撞区域和一个覆盖物体的精确碰撞区域。因此,如果对象触发器假定为碰撞,则您知道如果按钮将击中对象或将在其上方或下方传递,则子弹将有可能击中对象并进行一些详细计算。要确定对象是否在假定的碰撞区域,您可以使用circle collsion。

private bool DetectCircularCollision(Sprite a, Sprite b)
{
    float radius = Math.Sqrt(a.Width / 2 * a.Height / 2 + b.Width / 2 * b.Height / 2);
    float distance = Vector2.Distance(a.Position, b.Position);
    if (distance < radius) return true;
    return false;
}
到目前为止,我没有遇到这个问题,因为所有飞行物体都应该对玩家眼睛可见。如果你移动物体每帧50px或100px,玩家将不会注意到这一点,或者会混淆这是什么。

您可能需要结合几种碰撞方法来实现您的需求。建议,不要使用像素collsion,因为它完全没必要,它是resuorce杀手。相反,用几个边界框或圆圈覆盖对象。

假设蓝色圆圈为碰撞区域,红色圆圈为精确碰撞区域的示例。

enter image description here enter image description here