有限状态机实现
This commit is contained in:
parent
005586b64a
commit
3d60ac6485
|
@ -164,3 +164,5 @@ Network Trash Folder
|
|||
Temporary Items
|
||||
.apdisk
|
||||
|
||||
.refer
|
||||
.refer/*
|
|
@ -0,0 +1,49 @@
|
|||
package builtin
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"github.com/kercylan98/minotaur/game"
|
||||
)
|
||||
|
||||
func NewFSM[State comparable, Data any](data Data) *FSM[State, Data] {
|
||||
return &FSM[State, Data]{
|
||||
states: map[State]game.FSMState[State, Data]{},
|
||||
data: data,
|
||||
}
|
||||
}
|
||||
|
||||
type FSM[State comparable, Data any] struct {
|
||||
current State
|
||||
data Data
|
||||
states map[State]game.FSMState[State, Data]
|
||||
}
|
||||
|
||||
func (slf *FSM[State, Data]) Update() {
|
||||
state := slf.states[slf.current]
|
||||
state.Update(slf.data)
|
||||
}
|
||||
|
||||
func (slf *FSM[State, Data]) Register(state game.FSMState[State, Data]) {
|
||||
slf.states[state.GetState()] = state
|
||||
}
|
||||
|
||||
func (slf *FSM[State, Data]) Unregister(state State) {
|
||||
delete(slf.states, state)
|
||||
}
|
||||
|
||||
func (slf *FSM[State, Data]) HasState(state State) bool {
|
||||
_, has := slf.states[state]
|
||||
return has
|
||||
}
|
||||
|
||||
func (slf *FSM[State, Data]) Change(state State) {
|
||||
current := slf.states[slf.current]
|
||||
current.Exit(slf.data)
|
||||
|
||||
next := slf.states[state]
|
||||
if next == nil {
|
||||
panic(fmt.Errorf("FSM object is attempting to switch to an invalid / undefined state: %v", state))
|
||||
}
|
||||
|
||||
next.Enter(slf.data)
|
||||
}
|
|
@ -0,0 +1,34 @@
|
|||
package builtin
|
||||
|
||||
import "github.com/kercylan98/minotaur/game"
|
||||
|
||||
func NewFSMState[State comparable, Data any](state State, enter game.FSMStateEnterHandle[Data], update game.FSMStateUpdateHandle[Data], exit game.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 game.FSMStateEnterHandle[Data]
|
||||
update game.FSMStateUpdateHandle[Data]
|
||||
exit game.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)
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
package game
|
||||
|
||||
// FSM 有限状态机
|
||||
type FSM[State comparable, Data comparable] interface {
|
||||
Update()
|
||||
Register(state FSMState[State, Data])
|
||||
Unregister(state State)
|
||||
HasState(state State) bool
|
||||
Change(state State)
|
||||
}
|
|
@ -0,0 +1,15 @@
|
|||
package game
|
||||
|
||||
type (
|
||||
FSMStateEnterHandle[Data any] func(data Data)
|
||||
FSMStateUpdateHandle[Data any] func(data Data)
|
||||
FSMStateExitHandle[Data any] func(data Data)
|
||||
)
|
||||
|
||||
// FSMState 有限状态机状态
|
||||
type FSMState[State comparable, Data any] interface {
|
||||
GetState() State
|
||||
Enter(data Data)
|
||||
Update(data Data)
|
||||
Exit(data Data)
|
||||
}
|
Loading…
Reference in New Issue