import { BaseState } from "../../Framework/FSM/BaseState"; import { UIMgr } from "../../Framework/UI/UIMgr"; import { UIGame } from "../Game/UIGame"; import { World } from "../Game/World"; import { PlayerInfo } from "../../Shared/protocols/PtlLogin"; /** * 应用游戏状态 * 职责: * - 加载游戏场景 * - 初始化玩家角色 * - 监听服务器广播(其他玩家加入、移动等) * - 游戏主循环 */ export class AppStatusGame extends BaseState { private _player: PlayerInfo = null; private _isNewPlayer: boolean = false; private _uiGame: UIGame = null; constructor(fsm: any) { super(fsm, "Game"); } /** * 进入游戏状态 */ async onEnter(params?: any): Promise { super.onEnter(params); console.log("[AppStatusGame] 进入游戏世界"); // 保存玩家信息 if (params) { this._player = params.player || null; this._isNewPlayer = params.isNewPlayer || false; console.log(`[AppStatusGame] 玩家信息:`, this._player); console.log(`[AppStatusGame] 是否新玩家: ${this._isNewPlayer}`); } try { // 1. 加载游戏场景 await this.loadGameScene(); // 2. 初始化游戏 await this.initGame(); // 3. 开始监听服务器广播 this.listenServerMessages(); // 4. 开始游戏 this.startGame(); } catch (error) { console.error("[AppStatusGame] 进入游戏失败:", error); // 返回登录 this._fsm.changeState("Login"); } } /** * 加载游戏场景 */ private async loadGameScene(): Promise { console.log("[AppStatusGame] 加载游戏场景..."); // 加载游戏UI this._uiGame = await UIMgr.getInstance().load(UIGame); console.log("[AppStatusGame] 游戏场景加载完成"); } /** * 初始化游戏 */ private async initGame(): Promise { console.log("[AppStatusGame] 初始化游戏..."); if (!this._uiGame) { throw new Error("UIGame 未加载"); } // 获取世界根节点 const worldRoot = this._uiGame.getWorldRoot(); if (!worldRoot) { throw new Error("世界根节点未找到"); } // 初始化世界,传入本地玩家信息 await World.getInstance().init(worldRoot, this._player); console.log("[AppStatusGame] 游戏初始化完成"); } /** * 监听服务器广播消息 */ private listenServerMessages(): void { console.log("[AppStatusGame] 开始监听服务器广播..."); // 网络消息监听已在 World 中注册 // World 会自动处理 MsgPlayerJoin 和 MsgPlayerMove console.log("[AppStatusGame] 服务器广播监听已设置"); } /** * 开始游戏 */ private startGame(): void { console.log("[AppStatusGame] 游戏开始!"); // 游戏已启动,玩家可以通过 WASD 控制角色移动 } /** * 更新游戏状态(每帧调用) */ onUpdate(dt: number): void { // TODO: 游戏主循环逻辑 // - 更新角色位置 // - 检测碰撞 // - 更新敌人AI // - 同步网络状态 } /** * 暂停游戏 */ pauseGame(): void { console.log("[AppStatusGame] 游戏暂停"); // TODO: 暂停游戏逻辑 // - 停止游戏更新 // - 显示暂停菜单 } /** * 恢复游戏 */ resumeGame(): void { console.log("[AppStatusGame] 游戏恢复"); // TODO: 恢复游戏逻辑 // - 继续游戏更新 // - 隐藏暂停菜单 } /** * 玩家死亡 */ onPlayerDeath(): void { console.log("[AppStatusGame] 玩家死亡"); // TODO: 处理玩家死亡 // - 显示死亡界面 // - 显示复活选项或返回登录 // 延迟后返回登录 setTimeout(() => { this._fsm.changeState("Login"); }, 3000); } /** * 退出游戏(返回登录) */ quitGame(): void { console.log("[AppStatusGame] 退出游戏"); // TODO: 断开连接或通知服务器 // const netManager = NetManager.getInstance(); // await netManager.disconnect(); // 返回登录 this._fsm.changeState("Login"); } /** * 延迟辅助函数 */ private delay(ms: number): Promise { return new Promise(resolve => setTimeout(resolve, ms)); } /** * 退出游戏状态 */ onExit(): void { super.onExit(); console.log("[AppStatusGame] 离开游戏状态"); // 清理世界 World.clear(); // 卸载游戏UI if (this._uiGame) { UIMgr.getInstance().unload(UIGame); this._uiGame = null; } this._player = null; } }