用途:为构建结构良好的浏览器游戏提供架构参考知识,Three.js(3D)与 Phaser(2D)游戏均适用。目录内另有参考文件 system-patterns.md,涵盖对象池、delta-time 归一化、资源释放、波次/生成系统、增益/道具系统、触觉反馈与资源管理。
核心原则:核心循环优先——先实现最小可玩循环,顺序为 input -> movement -> fail condition -> scoring -> restart,之后再加视觉、音频等润色;初始范围保持小:1 个场景/关卡、1 个机制、1 个失败条件。事件驱动通信——模块之间不互相导入通信,跨模块消息统一走单例 EventBus 与预定义事件常量。集中式状态——单一 GameState 单例保存全部游戏状态,系统直接读状态、通过事件修改状态。配置集中化——所有魔法数字、平衡值、资源路径、生成点与计时值放入 Constants.js,游戏逻辑文件不含硬编码值。Orchestrator 模式——由 Game.js 类初始化系统、管理流程(boot -> gameplay -> death/win -> restart)并运行主循环;默认无标题画面,直接进入游戏,仅当用户明确要求时才加标题/菜单场景。重启安全且确定性——GameState.reset() 恢复干净状态,清理/关闭时移除所有事件监听,不残留引用、计时器、补间动画或孤立物理体;连续重启 3 次,第 3 次表现须与第 1 次一致。关注点分离——代码分层为 core/(Game、EventBus、GameState、Constants)、systems/(输入、物理、音频、粒子)、gameplay/(玩家、敌人、武器、计分)、level/(关卡构建、资源加载)、ui/(菜单、HUD、覆盖层)。
事件系统:命名采用 domain:action 格式并按功能分组,如 PLAYER_DAMAGED: 'player:damaged'、GAME_OVER: 'game:over'、ASSETS_LOADED: 'assets:loaded';事件数据一律传结构化对象而非原始值,例如 eventBus.emit(Events.PLAYER_DAMAGED, { amount: 10, source: 'enemy', damageType: 'melee' })。
状态与流程:GameState 按领域组织,含 player(health、maxHealth、speed、inventory、buffs)、combat(killCount、waveNumber、score)、game(started、paused、isPlaying)。标准流程为 Boot/Load -> Gameplay <-> Pause Menu(如需要)-> Game Over -> Gameplay(重启)。默认无标题画面。Play.fun 组件在游戏顶部死区处理分数显示、排行榜与钱包连接,因此无需游戏内分数 HUD。
常见陷阱:静态物理体(地面、墙)未用 physics.add.collider() 或 physics.add.overlap() 接线则无效果,每个边界或障碍都需显式碰撞接线;UI 交互元素被重叠显示对象遮挡会拦截指针事件,不要将交互元素藏在装饰层后;在核心循环可用前加粒子、屏幕震动、转场是常见时间陷阱;重启时不移除监听、销毁计时器与释放资源会导致幽灵行为、事件重复触发与内存泄漏。
发布前校验清单:核心循环可开始、游玩、失败/胜利并显示结果;连续重启 3 次行为一致;移动端触控/点击/滑动/陀螺仪可用且点击目标至少 44px;桌面键盘加鼠标可用;窗口缩放时画布正确响应;游戏逻辑无硬编码魔法数字;EventBus 无跨模块直接导入通信;关闭时移除所有监听并释放资源;有静音开关;移动基于 delta time 而非帧数;npm run build 无错误;运行时无未捕获异常或控制台错误。