import { FSM } from "./FSM"; import { BaseState } from "./BaseState"; /** * FSM 使用示例 * 展示如何创建和使用状态机 */ // ========== 示例1: 角色状态机 ========== /** * 待机状态 */ class IdleState extends BaseState { constructor(fsm: FSM) { super(fsm, "Idle"); } onEnter(params?: any): void { super.onEnter(params); console.log("角色进入待机状态"); } onExit(): void { super.onExit(); console.log("角色离开待机状态"); } } /** * 移动状态 */ class MoveState extends BaseState { private speed: number = 1; constructor(fsm: FSM) { super(fsm, "Move"); } onEnter(params?: any): void { super.onEnter(params); if (params && params.speed) { this.speed = params.speed; } console.log(`角色开始移动,速度: ${this.speed}`); } onUpdate(dt: number): void { console.log(`移动中... 速度: ${this.speed}`); // 在这里实现移动逻辑 } onExit(): void { super.onExit(); console.log("角色停止移动"); } } /** * 攻击状态 */ class AttackState extends BaseState { constructor(fsm: FSM) { super(fsm, "Attack"); } onEnter(params?: any): void { super.onEnter(params); console.log("角色进入攻击状态"); // 播放攻击动画 // 延迟后自动返回待机状态 setTimeout(() => { if (this._fsm.getCurrentStateName() === this.name) { this._fsm.changeState("Idle"); } }, 1000); } } /** * 死亡状态 */ class DeadState extends BaseState { constructor(fsm: FSM) { super(fsm, "Dead"); } onEnter(params?: any): void { super.onEnter(params); console.log("角色死亡"); // 播放死亡动画 } } // ========== 使用示例 ========== /** * 创建角色状态机 */ export function createCharacterFSM(): FSM { const fsm = new FSM(); // 添加所有状态 fsm.addState(new IdleState(fsm)); fsm.addState(new MoveState(fsm)); fsm.addState(new AttackState(fsm)); fsm.addState(new DeadState(fsm)); // 设置初始状态 fsm.changeState("Idle"); return fsm; } /** * 测试状态机 */ export function testFSM(): void { console.log("========== 开始测试FSM =========="); const fsm = createCharacterFSM(); // 测试状态切换 console.log("\n--- 测试1: 从待机到移动 ---"); fsm.changeState("Move", { speed: 5 }); console.log("\n--- 测试2: 从移动到攻击 ---"); fsm.changeState("Attack"); // 等待攻击状态自动结束 setTimeout(() => { console.log("\n--- 测试3: 攻击结束后返回待机 ---"); console.log(`当前状态: ${fsm.getCurrentStateName()}`); console.log("\n--- 测试4: 角色死亡 ---"); fsm.changeState("Dead"); console.log("\n========== FSM测试完成 =========="); }, 1500); } // ========== 示例2: 简单的游戏状态机 ========== class MenuState extends BaseState { constructor(fsm: FSM) { super(fsm, "Menu"); } onEnter(params?: any): void { super.onEnter(params); console.log("显示主菜单"); } } class PlayingState extends BaseState { constructor(fsm: FSM) { super(fsm, "Playing"); } onEnter(params?: any): void { super.onEnter(params); console.log("游戏开始"); } onUpdate(dt: number): void { // 游戏主循环 } } class PausedState extends BaseState { constructor(fsm: FSM) { super(fsm, "Paused"); } onEnter(params?: any): void { super.onEnter(params); console.log("游戏暂停"); } } /** * 创建游戏状态机 */ export function createGameFSM(): FSM { const fsm = new FSM(); fsm.addState(new MenuState(fsm)); fsm.addState(new PlayingState(fsm)); fsm.addState(new PausedState(fsm)); fsm.changeState("Menu"); return fsm; }