API: wingman.fsm
状态机模块,提供事件驱动的状态机功能,用于管理游戏状态、流程控制等场景。
模块概述
fsm 模块提供状态机的创建和管理功能:
- 创建状态机 - 创建命名状态机并指定初始状态
- 定义状态 - 定义状态及进入/离开回调
- 定义转移 - 定义状态转移规则,支持守卫函数
- 派发事件 - 触发状态转移
- 查询状态 - 获取当前状态、检查状态
创建状态机
create(name, initial)
说明:创建一个新的状态机实例。
函数签名:
python
create(name: str, initial: str) -> strlua
create(name: string, initial: string) -> string参数:
name- 状态机名称initial- 初始状态名
返回:
- 状态机 ID
python
from wingman import fsm
# 创建状态机
machine_id = fsm.create("combat", "idle")定义状态
state(machine_id, state_name, on_enter?, on_exit?) / state(machineId, stateName, onEnter?, onExit?)
说明:定义或更新一个状态及其回调。
函数签名:
python
state(machine_id: str, state_name: str, on_enter: Callable = None, on_exit: Callable = None) -> boollua
state(machineId: string, stateName: string, onEnter: function = nil, onExit: function = nil) -> boolean参数:
machine_id/machineId- 状态机 IDstate_name/stateName- 状态名on_enter/onEnter- 可选,进入状态时的回调,接收上下文对象{state, from?, event, payload}on_exit/onExit- 可选,离开状态时的回调,接收上下文对象{state, event, payload}
返回:
- 是否成功
python
from wingman import fsm
machine_id = fsm.create("combat", "idle")
# 定义状态
fsm.state(machine_id, "idle", on_enter=lambda ctx: print("进入空闲状态"))
fsm.state(machine_id, "fight", on_enter=lambda ctx: print("进入战斗状态"))定义状态转移
transition(machine_id, from, to, on?, guard?, action?) / transition(machineId, from, to, on?, guard?, action?)
说明:定义状态转移规则。
函数签名:
python
transition(machine_id: str, from: str, to: str, on: str = "", guard: Callable = None, action: Callable = None) -> boollua
transition(machineId: string, from: string, to: string, on: string = "", guard: function = nil, action: function = nil) -> boolean参数:
machine_id/machineId- 状态机 IDfrom- 源状态to- 目标状态on- 可选,触发事件名guard- 可选,守卫函数,接收{from, to, event, payload},返回True/true才允许转移action- 可选,转移动作函数,接收{from, to, event, payload}
返回:
- 是否成功
python
from wingman import fsm
# 定义状态转移
fsm.transition(machine_id, "idle", "fight", on="enemy_found")
fsm.transition(machine_id, "fight", "idle", on="enemy_lost")
# 带守卫函数
fsm.transition(machine_id, "pending", "running",
on="start", guard=lambda ctx: ctx['payload'].get('ready', False))派发事件
dispatch(machine_id, event, payload?) / dispatch(machineId, event, payload?)
说明:派发事件到状态机,触发可能的状态转移。
函数签名:
python
dispatch(machine_id: str, event: str, payload: dict = None) -> boollua
dispatch(machineId: string, event: string, payload: table = nil) -> boolean参数:
machine_id/machineId- 状态机 IDevent- 事件名payload- 可选,事件载荷
返回:
- 是否成功触发转移
python
from wingman import fsm
# 派发事件
fsm.dispatch(machine_id, "enemy_found", {"target": "boss"})获取当前状态
current(machine_id) / current(machineId)
说明:获取当前状态名。
函数签名:
python
current(machine_id: str) -> strlua
current(machineId: string) -> string参数:
machine_id/machineId- 状态机 ID
返回:
- 当前状态名
重置状态机
reset(machine_id) / reset(machineId)
说明:重置状态机到初始状态。
函数签名:
python
reset(machine_id: str) -> boollua
reset(machineId: string) -> boolean参数:
machine_id/machineId- 状态机 ID
返回:
- 是否成功
python
from wingman import fsm
# 重置状态机
fsm.reset(machine_id)事件
fsm.changed
每次状态机成功转移后,模块会发出 fsm.changed 事件。载荷字段:
machine- 状态机名称from- 源状态名to- 目标状态名event- 触发转移的事件名
可用 wingman.event.on("fsm.changed", cb) 订阅,集中观察状态变更。
可用接口
| Python 函数 | Lua 函数 | 说明 | 参数 |
|---|---|---|---|
create(name, initial) | create(name, initial) | 创建状态机 | name: 状态机名称 initial: 初始状态名 返回: 状态机ID |
state(machineId, stateName, onEnter?, onExit?) | state(machineId, stateName, onEnter?, onExit?) | 定义状态 | machineId: 状态机ID stateName: 状态名 onEnter: 进入回调(可选) onExit: 离开回调(可选) 返回: 是否成功 |
transition(machineId, from, to, on?, guard?, action?) | transition(machineId, from, to, on?, guard?, action?) | 定义转移 | machineId: 状态机ID from: 源状态 to: 目标状态 on: 事件名(可选) guard: 守卫函数(可选) action: 动作函数(可选) 返回: 是否成功 |
dispatch(machineId, event, payload?) | dispatch(machineId, event, payload?) | 派发事件 | machineId: 状态机ID event: 事件名 payload: 事件载荷(可选) 返回: 是否成功转移 |
current(machineId) | current(machineId) | 获取当前状态 | machineId: 状态机ID 返回: 当前状态名 |
reset(machineId) | reset(machineId) | 重置状态机 | machineId: 状态机ID 返回: 是否成功 |