【问题标题】:Computing collisions of a rectangle with path lines计算矩形与路径线的碰撞
【发布时间】:2011-11-16 09:43:39
【问题描述】:

我一直在寻找示例和教程,但找不到任何具体内容。

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

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

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

我想找到红色矩形的位置。

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

【问题讨论】:

  • 您使用矩形而不是圆形有什么具体原因吗?
  • @piotr Auguscik 可能是精度问题。
  • 只是问,用圆圈这样的任务更容易:)
  • 我需要使用矩形,因为我的玩家是一个角色,一个人。使用圆圈根本没有意义。
  • 你可以给他堆雪人!我不敢相信 XNA 没有为 2D 精灵提供本机碰撞检测,这令人震惊。也许这可能有一个例子? create.msdn.com/en-US/education/catalog/tutorial/…

标签: c# path xna collision


【解决方案1】:

假设您已经有办法检查特定碰撞盒是否包含碰撞,我建议在玩家当前位置和碰撞盒之间进行一种二分搜索:在您的碰撞和碰撞盒之间选择一个点以前已知的非碰撞框。用这个新的碰撞盒再次测试。如果不是碰撞,则在该点和已知碰撞框之间选择一个点,否则向后选择一个点。重复直到找到一个您满意的精度级别的非碰撞框(例如,大约 1 到 2 个像素)。只需少量测试,您应该就能找到这样一个点。

【讨论】:

  • 感谢您的回复。顺便问一下,您认为这种方法是否足够快?你知道有什么更快的方法吗?
  • 不客气。我也在考虑性能,这可能不是一种特别快速的方法,但它应该只在即将发生碰撞时才处于活动状态。根据您游戏的性质,只要玩家的速度不太大,您应该不需要超过 5 次左右的测试即可获得满意的位置,考虑到您可能正在做的,这是一个很小的数字在任何情况下都会在每一帧进行碰撞检查。如果不出意外,它可能是一个参考实现,您可以将其用作优化的基础。
  • 至于更快的替代方案,我认为这实际上取决于您的游戏机制和碰撞检查的实施。也许通过更聪明地进行碰撞检查,您可以获得有关碰撞位置的一些信息。例如,一旦发生碰撞,您可以使用较小的子矩形重新测试以查看碰撞的位置。这些信息可以让你快速计算出你需要将玩家向后移动多远,但这种机制可以在一些假设上起作用,而我不能轻易地对你的游戏做出这些假设。
  • 再次感谢丹尼尔。我确实像你说的那样工作得足够快。我还将精度测试限制在最初碰撞的对象上,因此它不会在寻找最近的地方后测试游戏中的每个对象。
猜你喜欢
  • 2013-04-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-16
  • 2014-09-03
  • 2014-04-08
  • 1970-01-01
相关资源
最近更新 更多