防围困机制是为了防止小球被方块围住而无法继续游戏的情况。当小球在规定时间内撞击方块的次数达到阈值时,系统会采用两阶段防围困策略:
在 BallController 组件中可以配置以下参数:
撞击记录: 每当小球撞击方块时,系统会记录撞击时间。
时间窗口清理: 系统会自动清理超出时间窗口的旧撞击记录。
阈值检测: 当时间窗口内的撞击次数达到阈值时,触发防围困机制。
偏移应用: 达到阈值时,首先尝试应用增强的角度偏移
偏移失效检测: 如果偏移尝试次数达到 deflectionAttemptThreshold
穿透状态: 激活0.5秒的穿透状态,小球可无视碰撞体积穿过方块但仍会播放撞击特效。
状态清理: 穿透状态结束后,小球恢复正常碰撞,撞击历史被清空,重置偏移尝试计数。
// 记录每个球的撞击时间历史
private ballHitHistory: Map<string, number[]> = new Map();
// 记录每个球的穿透结束时间
private ballPhaseThrough: Map<string, number> = new Map();
// 记录每个球的偏移尝试次数
private ballDeflectionAttempts: Map<string, number> = new Map();
onBeginContact(): 碰撞检测的核心方法,包含两阶段防围困逻辑calculateAntiTrapReflection(): 计算防围困增强偏移反弹方向cleanupExpiredAntiTrapStates(): 清理过期的穿透状态cleanupBallAntiTrapState(): 清理单个小球的防围困状态不改变碰撞组: 该机制不会修改方块的碰撞组设置,只是临时禁用碰撞。
视觉反馈: 即使在穿透状态下,仍会播放撞击特效,保持视觉一致性。
内存管理: 系统会自动清理过期数据,防止内存泄漏。
多球支持: 每个小球都有独立的防围困状态,互不影响。
系统会在控制台输出以下调试信息:
Ball {ballId} applied anti-trap deflection (attempt {current}/{max})
Ball {ballId} entered phase-through mode after {threshold} deflection attempts failed
Cleaned up anti-trap state for ball {ballId}