FSM状态机
This commit is contained in:
194
client/assets/scripts/Framework/FSM/FSMExample.ts
Normal file
194
client/assets/scripts/Framework/FSM/FSMExample.ts
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user