二维动作游戏的一种简单碰撞解决算法

主要观点:

  • 实现了一个简单的 2D AABB 碰撞解决算法,在某些类型游戏中效果较好,但仍有失败情况。
  • 给出了碰撞算法的演示及相关操作说明(左键添加静态碰撞体,右键添加动态碰撞体,WASD 移动动态碰撞体,可开启网格吸附和重力)。
  • 阐述了该实现的约束和限制,如仅支持轴对齐矩形、仅适用于动态对象与不可移动静态对象的交互等。
  • 说明算法的关键是在使用最小交集轴解决碰撞前选择重叠最大的碰撞体,按任意顺序遍历会导致卡住。
  • 提到了禁用“Snap to grid”时的振荡问题,即快速移动的物体通过较窄通道时会出现抖动,可通过撤销最后一次速度移动或使用备用轴来解决,也可使用固定大小网格或要求地图开口大于物体来避免。
  • 认为网上很多关于浮点的建议过于担心,自己在游戏中未因浮点表示而遇到物理问题。

关键信息:

  • 算法伪代码通过循环物理子步骤,找到地图和 actor_aabb 之间重叠的所有矩形交集,选择面积最大的矩形,沿最小轴移动来解决交集。
  • Python 实现函数resolve_map_collision用于修复与地图瓦片的重叠,通过多次迭代找到最大重叠的矩形并移动 actor_aabb。
  • 振荡问题在禁用“Snap to grid”时出现,快速移动的物体通过窄通道会导致无限振荡,可通过特定方法解决或避免。

重要细节:

  • 演示中不同操作的功能(左键、右键、WASD 键)。
  • 约束中关于 AABB 类型、动态与静态对象交互、离散分辨率等的限制。
  • 振荡问题触发的条件及示例图片。
  • 对浮点表示的看法及相关解释。
阅读 31
0 条评论