FSM状态机

This commit is contained in:
janing
2025-12-14 22:38:43 +08:00
parent 9989d60ee4
commit 1cfd79a231
11 changed files with 866 additions and 0 deletions

View File

@@ -0,0 +1,194 @@
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;
}