package states import ( "github.com/hajimehoshi/ebiten/v2" ) var SM StateMachine var StateMap map[string]State type State interface { Enter() Exit() Update() Draw(screen *ebiten.Image) } type StateMachine struct { CurrentState State } func NewStateMachine(initialState State) *StateMachine { sm := &StateMachine{CurrentState: initialState} sm.CurrentState.Enter() return sm } func (sm *StateMachine) Transition(newState string) { sm.CurrentState.Exit() sm.CurrentState = StateMap[newState] sm.CurrentState.Enter() } func (sm *StateMachine) Update() { sm.CurrentState.Update() } func (sm *StateMachine) Draw(screen *ebiten.Image) { sm.CurrentState.Draw(screen) } func SetupStateMachine() { loadState := &LoadLevelState{} playState := &PlayLevelState{} gameOverState := &GameOverState{} StateMap = make(map[string]State) StateMap["load"] = loadState StateMap["play"] = playState StateMap["game over"] = gameOverState SM = *NewStateMachine(loadState) }