【问题标题】:Collision Detection problem with loop order循环顺序的碰撞检测问题
【发布时间】: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


    【解决方案1】:

    好的,在寻找和思考解决方案后,我最终得到了这个:

    我的对撞机管理器现在以这种方式工作(3 个步骤):

    • 找到重叠
    • 收集碰撞信息
    • 按重叠区域(在信息中收集)对碰撞进行排序并解决

    所以,现在的主要区别是,我首先分析所有重叠/碰撞,然后处理它们,在这种情况下按重叠区域排序

    希望对你有帮助

    【讨论】:

    • 另一种选择可能是按两个碰撞对象的中点距离排序。
    • 这是我的第一个策略,但是,如果您的对象具有不同的大小,则无法使用。例如,在我的示例中的第二种情况下,如果 [enemy2] 更宽,那么到它的距离将大于到 [enemy1] 的距离,并且您将得到与从 [enemy1] 开始循环相同的结果。
    猜你喜欢
    • 2017-05-30
    • 2014-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多