循环顺序的碰撞检测问题
Collision Detection problem with loop order
我遇到的问题不是碰撞检测本身,而是检查顺序循环。
为了检测碰撞,我使用了 AABB。
视觉表示供参考:
https://i.imgur.com/7SaeUjX.png
场景 1:
- 我有三个方形对象; [玩家]、[敌人 1] 和 [敌人 2]。
- [enemy1] 和 [enemy2] 水平方向靠得很近,[玩家] 在 [enemy1].
上方
- 然后玩家开始用 向下箭头 + 向右箭头 不断移动。
- 所以现在,[player] 结束了 [enemy1],[enemy 2] 向右走。
- 因为第一个要检查的元素是[enemy1],所以碰撞系统修正了[player]的y位置,因为右边不认为是碰撞,所以可以往右走。
- 结果:一切顺利。 [玩家]可以毫无问题地一直往右走。
场景 2:
- 我有三个方形对象;玩家、敌人 1 和敌人 2。
- [enemy1] 和 [enemy2] 水平方向靠得很近,[玩家] 在 [enemy2].
上方
- 然后玩家开始用 DownArrow + LeftArrow 不断移动。
- 所以现在,[player] 越过 [enemy2],[enemy 1] 向左。
- 因为要检查的第一个元素是[enemy1],所以碰撞系统会修正[player]的y位置和x位置,当然还有[ enemy2] 碰撞在这一点上并不重要。
- 结果:当然,[player]被[enemy1]挡住了,无法继续向左走。
我在场景 2 中遇到的问题的解释:
问题出在碰撞的检查顺序上。循环开始检查玩家是否直接与 [enemy1] 发生碰撞,因为它是第一个被检查的,因此 [player] 当然会检测到与 [enemy1] 发生碰撞并解决 2 次碰撞,结果不佳。
如果你改变列表的顺序,从[enemy2]开始,当然问题反过来了。
我应该怎么做才能避免这种情况?
好的,在寻找和思考解决方案之后,我得到了这个:
我的对撞机管理器现在以这种方式工作(3 个步骤):
- 找到重叠
- 收集碰撞信息
- 按重叠区域(在信息中收集)和 resolutes 对碰撞进行排序
所以,现在的主要区别是,我首先分析所有 overlaps/collisions,然后处理它们,在这种情况下按重叠区域排序
希望对你有所帮助
我遇到的问题不是碰撞检测本身,而是检查顺序循环。
为了检测碰撞,我使用了 AABB。
视觉表示供参考: https://i.imgur.com/7SaeUjX.png
场景 1:
- 我有三个方形对象; [玩家]、[敌人 1] 和 [敌人 2]。
- [enemy1] 和 [enemy2] 水平方向靠得很近,[玩家] 在 [enemy1]. 上方
- 然后玩家开始用 向下箭头 + 向右箭头 不断移动。
- 所以现在,[player] 结束了 [enemy1],[enemy 2] 向右走。
- 因为第一个要检查的元素是[enemy1],所以碰撞系统修正了[player]的y位置,因为右边不认为是碰撞,所以可以往右走。
- 结果:一切顺利。 [玩家]可以毫无问题地一直往右走。
场景 2:
- 我有三个方形对象;玩家、敌人 1 和敌人 2。
- [enemy1] 和 [enemy2] 水平方向靠得很近,[玩家] 在 [enemy2]. 上方
- 然后玩家开始用 DownArrow + LeftArrow 不断移动。
- 所以现在,[player] 越过 [enemy2],[enemy 1] 向左。
- 因为要检查的第一个元素是[enemy1],所以碰撞系统会修正[player]的y位置和x位置,当然还有[ enemy2] 碰撞在这一点上并不重要。
- 结果:当然,[player]被[enemy1]挡住了,无法继续向左走。
我在场景 2 中遇到的问题的解释:
问题出在碰撞的检查顺序上。循环开始检查玩家是否直接与 [enemy1] 发生碰撞,因为它是第一个被检查的,因此 [player] 当然会检测到与 [enemy1] 发生碰撞并解决 2 次碰撞,结果不佳。
如果你改变列表的顺序,从[enemy2]开始,当然问题反过来了。
我应该怎么做才能避免这种情况?
好的,在寻找和思考解决方案之后,我得到了这个:
我的对撞机管理器现在以这种方式工作(3 个步骤):
- 找到重叠
- 收集碰撞信息
- 按重叠区域(在信息中收集)和 resolutes 对碰撞进行排序
所以,现在的主要区别是,我首先分析所有 overlaps/collisions,然后处理它们,在这种情况下按重叠区域排序
希望对你有所帮助