C# 计算矩形与路径线的碰撞

C# 计算矩形与路径线的碰撞,c#,path,xna,collision,C#,Path,Xna,Collision,我一直在寻找样本和教程,但我找不到任何具体的 我正在制作一个2D XNA C游戏,我想在玩家到达一条或多条路径线时检测玩家的最终位置,这样它就不会穿过它们 播放器由一个碰撞矩形组成,路径线都是线段。基本上我有玩家的碰撞矩形和下一个玩家的位置碰撞矩形。如果下一个玩家的位置与路径线发生碰撞,我想找出玩家可以承受的最大位移 图中或多或少显示了我想要做的事情: 我想找到红色矩形的位置 有没有人有任何算法、解决方案或链接可以帮助我?甚至可以是一个示例。假设您已经有办法检查特定的碰撞框是否包含碰撞,我建议在

我一直在寻找样本和教程,但我找不到任何具体的

我正在制作一个2D XNA C游戏,我想在玩家到达一条或多条路径线时检测玩家的最终位置,这样它就不会穿过它们

播放器由一个碰撞矩形组成,路径线都是线段。基本上我有玩家的碰撞矩形和下一个玩家的位置碰撞矩形。如果下一个玩家的位置与路径线发生碰撞,我想找出玩家可以承受的最大位移

图中或多或少显示了我想要做的事情:

我想找到红色矩形的位置



有没有人有任何算法、解决方案或链接可以帮助我?甚至可以是一个示例。

假设您已经有办法检查特定的碰撞框是否包含碰撞,我建议在玩家的当前位置和碰撞框之间进行某种二进制搜索:在碰撞框和之前已知的非碰撞框之间选择一个中间点。使用此新碰撞框再次测试。如果不是碰撞,则在该点和已知碰撞框之间拾取一个点,否则在向后拾取一个点。重复此操作,直到找到一个精度令人满意的非碰撞框,例如1到2像素。只要进行少量测试,您就应该能够找到这样一个点。

假设您已经有了检查特定碰撞框是否包含碰撞的方法,我建议在玩家的当前位置和碰撞框之间进行一种二进制搜索:在你的碰撞和之前已知的非碰撞框之间选择一个中间点。使用此新碰撞框再次测试。如果不是碰撞,则在该点和已知碰撞框之间拾取一个点,否则在向后拾取一个点。重复此操作,直到找到一个精度令人满意的非碰撞框,例如1到2像素。只要做几个测试,你就能找到这样一个点。

你为什么使用矩形而不是圆形,有什么具体的原因吗?@piotr Auguscik可能是一个精度问题。只要问一下,使用圆形,这样的任务更容易:我需要使用矩形,因为我的玩家是一个角色,一个人。用圆圈根本没有意义。你可以把他变成一个雪人!我不敢相信XNA没有为2D精灵提供本机碰撞检测,这太令人震惊了。也许这有一个例子?你使用矩形而不是圆形有什么具体的原因吗?@piotr Auguscik可能是一个精确性问题。只要问一下,使用圆形这样的任务就更容易了:我需要使用矩形,因为我的玩家是一个角色,一个人。用圆圈根本没有意义。你可以把他变成一个雪人!我不敢相信XNA没有为2D精灵提供本机碰撞检测,这太令人震惊了。也许这有一个例子?谢谢你的回复。顺便问一下,你认为这个方法足够快吗?你知道有什么更快的方法吗?不客气。我也在考虑性能,这可能不是一种特别快的方法,但它应该只有在碰撞即将发生时才激活。根据游戏的性质,只要玩家的速度不是太大,你不需要超过5次左右的测试来获得满意的位置,考虑到你可能在任何情况下都在每一帧进行碰撞检查,这是一个很小的数字。如果没有其他东西,它可能是一个参考实现,您可以将其用作优化的基础。至于更快的替代方案,我认为这将真正取决于您的游戏机制和碰撞检查的实现。也许通过更巧妙地执行碰撞检查,您可以获得有关碰撞位置的一些信息。例如,一旦发生碰撞,可以使用较小的子矩形重新测试,以查看碰撞的位置。这些信息可能会让你快速计算出你需要将玩家向后移动多远,但是这个机制会基于一些假设,这是我无法轻易对你的游戏做出的假设。再次感谢丹尼尔。我照你说的做了,而且速度足够快。我还将精度测试限制在最初碰撞的对象上,因此在寻找最近的位置后,它不会测试游戏中的每个对象。感谢您的回复。顺便问一下,你认为这个方法足够快吗?你知道有什么更快的方法吗?不客气。我也在考虑性能,这可能不是一种特别快的方法,但它应该只有在碰撞即将发生时才激活。根据游戏的性质,只要玩家的速度不是太大,你就不需要说更多的话
5次左右的测试以获得满意的位置,这是一个很小的数字,考虑到您可能在任何情况下都在每个帧上进行碰撞检查。如果没有其他东西,它可能是一个参考实现,您可以将其用作优化的基础。至于更快的替代方案,我认为这将真正取决于您的游戏机制和碰撞检查的实现。也许通过更巧妙地执行碰撞检查,您可以获得有关碰撞位置的一些信息。例如,一旦发生碰撞,可以使用较小的子矩形重新测试,以查看碰撞的位置。这些信息可能会让你快速计算出你需要将玩家向后移动多远,但是这个机制会基于一些假设,这是我无法轻易对你的游戏做出的假设。再次感谢丹尼尔。我照你说的做了,而且速度足够快。我还将精度测试仅限于最初碰撞的对象,因此在寻找最近的位置后,它不会测试游戏中的每个对象。