195 lines
4.1 KiB
TypeScript
195 lines
4.1 KiB
TypeScript
|
|
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;
|
||
|
|
}
|