防围困机制是为了防止小球被方块围住而无法继续游戏的情况。当小球在规定时间内撞击方块的次数达到阈值时,小球将进入短暂的穿透状态,可以无视碰撞体积穿过方块。
在 BallController 组件中可以配置以下参数:
撞击记录: 每当小球撞击方块时,系统会记录撞击时间。
时间窗口清理: 系统会自动清理超出时间窗口的旧撞击记录。
阈值检测: 当时间窗口内的撞击次数达到阈值时,触发防围困机制。
穿透状态: 小球进入穿透状态,持续 0.5 秒,期间可以穿过方块但仍会播放撞击特效。
状态清理: 穿透状态结束后,小球恢复正常碰撞,撞击历史被清空。
// 记录每个球的撞击时间历史
private ballHitHistory: Map<string, number[]> = new Map();
// 记录每个球的穿透结束时间
private ballPhaseThrough: Map<string, number> = new Map();
onBeginContact(): 碰撞检测的核心方法,包含防围困逻辑cleanupExpiredAntiTrapStates(): 清理过期的穿透状态cleanupBallAntiTrapState(): 清理单个小球的防围困状态不改变碰撞组: 该机制不会修改方块的碰撞组设置,只是临时禁用碰撞。
视觉反馈: 即使在穿透状态下,仍会播放撞击特效,保持视觉一致性。
内存管理: 系统会自动清理过期数据,防止内存泄漏。
多球支持: 每个小球都有独立的防围困状态,互不影响。
当小球进入穿透状态时,控制台会输出调试信息:
Ball {ballId} entered phase-through mode due to frequent collisions