有限状态机实现
This commit is contained in:
parent
005586b64a
commit
3d60ac6485
|
@ -164,3 +164,5 @@ Network Trash Folder
|
||||||
Temporary Items
|
Temporary Items
|
||||||
.apdisk
|
.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