1) 版本与依赖
- 严格匹配版本:
flame 与 flame_forge2d 必须是官方兼容对。去掉 ^,使用精确版本号并把 pubspec.lock 入库。 - 升级时同时升级两者;若不兼容,优先退回到上一组“已验证对”。
- 避免长期使用
dependency_overrides 指向未发布分支;仅应急用。
2) 坐标系与单位(最容易混淆)
- Flame 渲染/输入是像素;Forge2D 物理是米。
Forge2DGame.zoom == pixelsPerMeter(PPM)。常用 zoom=100 → 1m=100px。 - 输入转换:
camera.viewfinder.screenToWorld(px) / zoom → 米;渲染反过来用 worldToScreen(m*zoom)。 - 规则:物理相关(位置、速度、半径、力)一律用“米”;只在渲染与输入边界做换算。
3) 相机与锚点
- 使用 Flame 的
CameraComponent / viewfinder 控制视口,不要通过改 zoom 来做适配。 - 精准对齐:渲染时保证 anchor=center,图像尺寸用
半径(米)*2*zoom。 - 相机平移/缩放后,务必用 viewfinder 的转换函数 处理触摸坐标。
4) 时间步进与稳定性
Forge2DGame 已内置固定步长(60Hz)。不要在 update 中再手写 world.step() 造成重复步进。 - 需要慢动作/加速回放时,改变渲染节奏或模拟次数,不要改物理
dt 的大小幅度。 - 物理发散/抖动时,优先降低 restitution(e)、提高
linearDamping/ angularDamping、增大迭代次数(速度 8–10、位置 3–5)。
5) 刚体与形状
- 圆体:用
CircleShape,性能与稳定性最友好。 - 地形:用
ChainShape(多段线/样条采样),点不要过密(建议采样步长 0.05–0.2m)。 - 大物体可能穿透:设置
body.bullet = true 或提高速度迭代数;必要时限制最大速度。 - 切勿频繁
create/destroy Body:能复用就用对象池,或延迟销毁到帧末。