diff --git a/game/fms/fsm_state.go b/game/fms/fsm_state.go deleted file mode 100644 index 15441c7..0000000 --- a/game/fms/fsm_state.go +++ /dev/null @@ -1,38 +0,0 @@ -package fms - -type ( - FSMStateEnterHandle[Data any] func(data Data) - FSMStateUpdateHandle[Data any] func(data Data) - FSMStateExitHandle[Data any] func(data Data) -) - -func NewFSMState[State comparable, Data any](state State, enter FSMStateEnterHandle[Data], update FSMStateUpdateHandle[Data], exit FSMStateExitHandle[Data]) *FSMState[State, Data] { - return &FSMState[State, Data]{ - enter: enter, - update: update, - exit: exit, - } -} - -type FSMState[State comparable, Data any] struct { - state State - enter FSMStateEnterHandle[Data] - update FSMStateUpdateHandle[Data] - exit FSMStateExitHandle[Data] -} - -func (slf *FSMState[State, Data]) GetState() State { - return slf.state -} - -func (slf *FSMState[State, Data]) Enter(data Data) { - slf.enter(data) -} - -func (slf *FSMState[State, Data]) Update(data Data) { - slf.update(data) -} - -func (slf *FSMState[State, Data]) Exit(data Data) { - slf.exit(data) -} diff --git a/game/fms/fsm.go b/game/fsm/fsm.go similarity index 67% rename from game/fms/fsm.go rename to game/fsm/fsm.go index c281f12..8056262 100644 --- a/game/fms/fsm.go +++ b/game/fsm/fsm.go @@ -1,40 +1,47 @@ -package fms +package fsm import ( "fmt" ) +// NewFSM 创建一个新的状态机 func NewFSM[State comparable, Data any](data Data) *FSM[State, Data] { return &FSM[State, Data]{ - states: map[State]*FSMState[State, Data]{}, + states: map[State]*State[State, Data]{}, data: data, } } +// FSM 状态机 type FSM[State comparable, Data any] struct { current State data Data - states map[State]*FSMState[State, Data] + states map[State]*State[State, Data] } +// Update 触发当前状态 func (slf *FSM[State, Data]) Update() { state := slf.states[slf.current] state.Update(slf.data) } -func (slf *FSM[State, Data]) Register(state *FSMState[State, Data]) { +// Register 注册状态 +func (slf *FSM[State, Data]) Register(state *State[State, Data]) { slf.states[state.GetState()] = state } +// Unregister 反注册状态 func (slf *FSM[State, Data]) Unregister(state State) { delete(slf.states, state) } +// HasState 检查状态机是否存在特定状态 func (slf *FSM[State, Data]) HasState(state State) bool { _, has := slf.states[state] return has } +// Change 改变状态机状态到新的状态 func (slf *FSM[State, Data]) Change(state State) { current := slf.states[slf.current] current.Exit(slf.data) diff --git a/game/fsm/fsm_state.go b/game/fsm/fsm_state.go new file mode 100644 index 0000000..4d73fd8 --- /dev/null +++ b/game/fsm/fsm_state.go @@ -0,0 +1,38 @@ +package fsm + +type ( + StateEnterHandle[Data any] func(data Data) + StateUpdateHandle[Data any] func(data Data) + StateExitHandle[Data any] func(data Data) +) + +func NewFSMState[S comparable, Data any](state S, enter StateEnterHandle[Data], update StateUpdateHandle[Data], exit StateExitHandle[Data]) *State[S, Data] { + return &State[S, Data]{ + enter: enter, + update: update, + exit: exit, + } +} + +type State[S comparable, Data any] struct { + state S + enter StateEnterHandle[Data] + update StateUpdateHandle[Data] + exit StateExitHandle[Data] +} + +func (slf *State[S, Data]) GetState() S { + return slf.state +} + +func (slf *State[S, Data]) Enter(data Data) { + slf.enter(data) +} + +func (slf *State[S, Data]) Update(data Data) { + slf.update(data) +} + +func (slf *State[S, Data]) Exit(data Data) { + slf.exit(data) +}