2D平台AABB碰撞问题

时间:2011-07-04 20:37:50

标签: c# 2d collision-detection physics

http://dl.dropbox.com/u/3724424/Programming/Gifs/game6.gif

我遇到AABB冲突解决问题。


我通过首先解析X轴然后解析Y轴来解析AABB交叉点。 这样做是为了防止此错误:http://i.stack.imgur.com/NLg4j.png


当一个物体移动到玩家并且必须水平推动玩家时,当前方法可以正常工作。正如您在.gif中看到的那样,水平尖峰会正确推动播放器。


然而,当垂直尖峰进入播放器时,X轴仍然首先被解析。这使得“使用尖钉作为升力”是不可能的。

当玩家进入垂直尖峰(受重力影响,落入其中)时,他被推到Y轴上,因为X轴上没有重叠开始。


我尝试过的是first answer of this link中描述的方法。 然而,尖峰和移动物体通过改变位置而不是速度来移动,并且在调用Update()方法之前我不计算它们的下一个预测位置。 不用说这个解决方案也不起作用。 :(


我需要以上述两种情况按预期工作的方式解决AABB碰撞。

这是我目前的碰撞源代码:http://pastebin.com/MiCi3nA1

如果有人可以调查一下,我会非常感激,因为这个错误从一开始就一直存在于引擎中,而且我一直在努力找到一个好的解决方案,但没有任何成功。这让我花了很多时间看着碰撞代码并阻止我进入“有趣的部分”并编写游戏逻辑:(


我尝试实现与XNA AppHub平台演示中相同的碰撞系统(通过复制粘贴大部分内容)。然而,“跳跃”错误发生在我的游戏中,而在AppHub演示中却没有。 [跳跃的错误:http://i.stack.imgur.com/NLg4j.png]

要跳转我检查播放器是否为“onGround”,然后将-5添加到Velocity.Y。

由于玩家的Velocity.X高于Velocity.Y(参考图中的第四个面板),onGround在不应该的时候设置为true,因此让玩家在半空中跳跃。 / p>

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

我先解决了这个问题,首先在X轴上解析,然后在Y轴上解析。但是,正如我上面所述,它会加剧与尖钉的碰撞。

3 个答案:

答案 0 :(得分:0)

为什么不首先在Y轴上解决垂直尖峰,在X轴上先解决水平尖峰?

顺便说一下,好的图形。


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

  1. 移动所有对象。
  2. 对于每个对象 O ,测试播放器与 O 之间的交集,如有必要,水平或垂直弹出播放器,使其不再与< EM> 0
  3. 如果玩家仍然与某个对象相交,那么(某事)
  4. 这意味着当你进入步骤(2)时,你已经忘记了对象 O 正在移动的方向,所以你无法判断它是否试图向上或向侧面推动玩家

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

答案 1 :(得分:0)

正如Gareth Rees已经说过的那样,问题是在检测到碰撞后,您需要更多信息(当前位置和方向来自或最后位置)来执行碰撞响应。

如果两个物体都在移动,那就太复杂了。相反,选择一个对象作为参考框架,并从其他一切中减去其速度。

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

答案 2 :(得分:0)

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