Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 二维平台AABB碰撞问题_C#_2d_Collision Detection_Physics - Fatal编程技术网

C# 二维平台AABB碰撞问题

C# 二维平台AABB碰撞问题,c#,2d,collision-detection,physics,C#,2d,Collision Detection,Physics,我对AABB碰撞解决方案有问题 我通过先解析X轴,然后解析Y轴来解析AABB交点。 这样做是为了防止此错误: 当前方法在对象移动到播放器中并且必须水平推动播放器时可以正常工作。正如您在.gif中所看到的,水平尖刺可以正确地推动播放器 然而,当垂直尖刺移动到玩家身上时,X轴仍然首先被解析。这使得“使用钉子作为提升”变得不可能 当玩家移动到垂直的钉子中(受重力影响,落入钉子中)时,他在Y轴上被推,因为X轴上没有重叠 我试过的方法是在。 但是,尖峰和移动的对象是通过改变它们的位置而不是速度来移

我对AABB碰撞解决方案有问题


我通过先解析X轴,然后解析Y轴来解析AABB交点。 这样做是为了防止此错误:


当前方法在对象移动到播放器中并且必须水平推动播放器时可以正常工作。正如您在.gif中所看到的,水平尖刺可以正确地推动播放器


然而,当垂直尖刺移动到玩家身上时,X轴仍然首先被解析。这使得“使用钉子作为提升”变得不可能

当玩家移动到垂直的钉子中(受重力影响,落入钉子中)时,他在Y轴上被推,因为X轴上没有重叠


我试过的方法是在。 但是,尖峰和移动的对象是通过改变它们的位置而不是速度来移动的,在调用它们的Update()方法之前,我不会计算它们的下一个预测位置。 不用说,这个解决方案也不起作用(


我需要以上述两种情况都能正常工作的方式解决AABB冲突

这是我当前的冲突源代码:

如果有人能对此进行调查,我将不胜感激,因为这个bug从一开始就一直存在于引擎中,我一直在努力寻找一个好的解决方案,但没有任何成功。这严重地让我花了很多晚上来查看冲突代码,并阻止我进入“有趣的部分”并对游戏逻辑进行编码:(


我尝试实现与XNA AppHub platformer演示中相同的碰撞系统(通过复制粘贴大部分内容)。但是“跳跃”错误出现在我的游戏中,而AppHub演示中没有。 [跳虫:]

为了跳转,我检查玩家是否是“onGround”,然后在Velocity.Y上加-5

由于玩家的Velocity.X高于Velocity.Y(请参考图表中的第四个面板),onGround在不应该的时候被设置为true,因此玩家可以在半空中跳跃

我相信这不会发生在AppHub演示中,因为播放器的Velocity.X永远不会高于Velocity.Y,但我可能弄错了


我之前先在X轴上解析,然后在Y轴上解析,解决了这个问题。但是,正如我前面所述,这会导致与尖峰的碰撞。为什么不先在Y轴上解析垂直尖峰,然后在X轴上解析水平尖峰

顺便说一句,很好的图形


据我所知,你在处理运动和碰撞,就像这样:

  • 移动所有对象
  • 对于每个对象O,测试播放机和O之间的交点,如有必要,水平或垂直弹出播放机,使其不再与O相交
  • 如果玩家仍然与某个对象相交,那么(某个对象)
  • 这意味着,当你进入第(2)步时,你已经忘记了对象O的移动方向,因此你无法判断它是试图将播放器向上推还是侧向推


    解决方案:在步骤(1)中,为每个对象存储其移动的方向。当您发现播放器与对象相交时,您可以查看对象是向上、向下、向左还是向右移动,这将告诉您执行弹射的方式。

    正如Gareth Rees所说,问题是在检测到碰撞后,您需要更多信息(当前位置和任一方向均来自或来自上一个位置)以执行碰撞响应

    如果两个物体都在移动,情况会变得相当复杂。相反,选择一个物体作为参考系,并从其他物体中减去其速度


    一个直接的解决方案可能是为非参照系对象的移动/增量创建线段。然后将这些线段与4条AABB边相交。这将给出相交时间和相交点处的法线。然后您可以应用与现在相同的响应。

    我发现的一个可能的解决方案是根据玩家的速度在解析之前对对象进行排序。

    这是“最后的解决方案”。我更喜欢找到一个在任何情况下都能“自动”工作的通用解决方案。你不是打算继续“有趣的部分”吗?;)这个解决方案听起来相当不错,也许它是唯一/最好的解决方案。尝试一下,移动一个,你以后总是可以回到它。仔细想想,你需要处理移动的“平台”与静态碰撞平铺不同。当玩家在移动平台上时,移动平台意味着在评估碰撞之前,每一帧都要将平台移动的增量位置添加到玩家位置。这需要在玩家移动之前移动平台。请参阅此处的平台部分:仅供参考gamedev.stackexchange.com上的同一个问题-它有更多的答案: