我在AABB碰撞解决方案上遇到了问题。
我先解决X轴,然后解决Y轴以解决AABB相交。这样做是为了防止出现以下错误:http://i.stack.imgur.com/NLg4j.png
当物体向玩家移动且需要水平推动玩家时,当前方法运行良好。正如你在gif中所看到的,水平钉子正确地推动了玩家。
然而,当垂直钉子移动到玩家时,仍然首先解决X轴。这使得“使用钉子作为升降机”变得不可能。
当玩家移动到垂直钉子(受重力影响,掉落到它们里面)时,因为一开始没有重叠的X轴,所以会在Y轴上被推开。
我尝试过的一些方法是第一个答案所描述的链接中的方法。然而,钉子和移动物体是通过改变它们的位置而不是速度来移动的,而且我直到调用它们的Update()方法之前才计算它们的下一个预测位置。不用说这个解决方案也没有起作用 :(
我需要以一种方式解决AABB碰撞,使得上述两种情况都按预期工作。
这是我的当前碰撞源代码:http://pastebin.com/MiCi3nA1
如果有人能够帮忙解决这个问题,我将不胜感激,因为这个错误从一开始就存在于引擎中,我一直在努力寻找一个好的解决方案,但一直没有成功。这让我花费了很多时间看碰撞代码,阻止我进入“有趣的部分”并编写游戏逻辑 :(
我尝试实现与XNA AppHub平台游戏演示相同的碰撞系统(通过复制大部分内容)。然而,在我的游戏中出现了“跳跃”错误,而在AppHub演示中没有出现。[跳跃错误: http://i.stack.imgur.com/NLg4j.png]
要跳跃,我检查玩家是否“在地面上”,然后将-5添加到Velocity.Y中。
由于玩家的Velocity.X大于Velocity.Y(参见图示中的第四个面板),所以当它不应该时,onGround被设置为true,从而让玩家在空中跳跃。
我认为这在AppHub演示中不会发生,因为玩家的Velocity.X永远不会高于Velocity.Y,但我可能错了。
我之前通过先在X轴上解决问题,然后在Y轴上解决问题来解决这个问题。但这会破坏与尖刺的碰撞,就像我上面所说的那样。