【发布时间】:2020-04-15 15:42:11
【问题描述】:
我遇到的问题不是碰撞检测本身,而是检查顺序循环。
为了检测碰撞,我使用的是 AABB。
视觉表示供参考: https://i.imgur.com/7SaeUjX.png
场景 1:
- 我有三个方形对象; [玩家]、[敌人 1] 和 [敌人 2]。
- [enemy1] 和 [enemy2] 水平接近,[player] 在 [enemy1] 上方。
- 然后玩家开始不断地使用 DownArrow + RightArrow 移动。
- 所以现在,[玩家] 结束了 [enemy1] 并且 [enemy 2] 继续前进。
- 由于要检查的第一个元素是 [enemy1],因此碰撞系统会修正 [player] 的 y 位置,并且由于不认为右侧发生碰撞,因此可以向右走。
- 结果:一切正常。 [玩家] 可以毫无问题地继续向右移动。
场景 2:
- 我有三个方形对象;玩家、敌人 1 和敌人 2。
- [enemy1] 和 [enemy2] 水平接近,[player] 在 [enemy2] 上方。
- 然后玩家开始不断地使用 DownArrow + LeftArrow 移动。
- 所以现在,[玩家] 已经结束 [enemy2] 并且 [enemy 1] 向左走。
- 因为要检查的第一个元素是 [enemy1],所以碰撞系统会更正 [player] 的 y 位置、和 x 位置,当然还有 [enemy2] 的碰撞。在这一点上并不重要。
- 结果:当然,[player] 被 [enemy1] 挡住了,不能继续向左走。
解释我在场景 2 中遇到的问题:
问题在于碰撞的检查顺序。循环开始检查玩家是否直接与 [enemy1] 碰撞,因为它是第一个被检查的,所以 [player] 当然会检测到它与 [enemy1] 碰撞并解决 2 次碰撞,从而给出错误的结果。
如果你改变列表的顺序,从 [enemy2] 开始,当然问题反过来了。
我应该怎么做才能避免这种情况?
【问题讨论】:
标签: javascript collision-detection game-engine