本文详解 libgdx 中因碰撞标志(flag)被反复覆盖导致“仅最后创建的图形能触发碰撞”的典型 bug,提供安全、可扩展的 `checkforcollision` 实现方案,并强调状态重置与条件赋值的关键原则。
在 LibGDX 项目中实现自定义碰撞系统时,一个常见却隐蔽的问题是:多个同类可碰撞对象(如多个 daCircle 或 daRect)中,仅有最新创建的实例能成功触发碰撞响应。这并非继承机制失效(子类确实完整继承了 Collidable 的行为),而是源于 checkForCollision 方法中对布尔标志(如 circlesAreColliding)的不安全更新逻辑。
原始代码的核心缺陷在于:
if (daShape instanceof daCircle && nextShape instanceof daCircle) {
setCirclesCollisionFlag(isCirclesColliding(...)); // ❌ 危险!每次调用都覆盖旧值
}
该写法会在遍历每一对形状时无条件调用 setCirclesCollisionFlag(…) —— 即使前一次检测返回 true,只要下一次检测返回 false,标志就会被错误地重置为 false。最终,只有循环中最后一次比较的结果决定标志状态,造成“只有最后参与比较的两个圆能碰撞”的假象。
✅ 正确做法是: