问题分析
用户反馈游戏出现严重 bug:
- 鸟一直左上角不动
- 点哪里都不动
- 敌人没出现
根本原因
游戏循环依赖项过多:useEffect 的依赖项包含了
birdY 和 birdX,导致每次小鸟位置改变时,useEffect 都会重新执行,游戏循环不断重启,造成:- 小鸟被卡住无法移动
- 控制失效
- 游戏体验完全崩溃
修复方案
1. 修复游戏循环依赖项(关键修复)
修改前:
}, [gameState, birdY, birdX, moveLeft, moveRight, spirits, enemies, lives, currentLevel, invincible, roundStatus, currentRound, totalRounds, hitCountInRound, startRound]);
修改后:
}, [gameState]);
原理:游戏循环只需要在游戏状态改变时重启,不需要在每次小鸟位置改变时重启。移除不必要的依赖项可以避免循环不断重启。
2. 修复敌人生成延迟
修改前:
console.log(`[initLevel] 设置敌人生成定时器,延迟1000ms`);
setTimeout(() => {
// ...
}, 2000); // 实际延迟还是2000ms!
修改后:
console.log(`[initLevel] 设置敌人生成定时器,延迟500ms`);
setTimeout(() => {
// ...
}, 500); // 实际延迟500ms
效果
- ✅ 小鸟可以正常移动,不再卡住
- ✅ 触摸、鼠标、键盘控制全部恢复正常
- ✅ 敌人会在 500ms 后出现,不再需要等待 2 秒
- ✅ 游戏循环稳定运行,不会反复重启
- ✅ 游戏体验恢复正常
深度反思
这个问题教训深刻:useEffect 的依赖项必须谨慎选择。过度依赖会导致:
- 性能问题(useEffect 频繁执行)
- 逻辑错误(循环不断重启)
- 用户体验崩溃(游戏无法正常进行)
最佳实践:只在真正需要时才添加依赖项,对于游戏循环这类高频执行的逻辑,应该只依赖触发条件(如 gameState),而不是依赖所有可能改变的状

