package client import "github.com/hajimehoshi/ebiten/v2" type GameState interface { Enter() error Update() (GameState, error) Draw(*ebiten.Image) Exit() error } type StateManager struct { currentState GameState } func (m *StateManager) ChangeState(state GameState) error { if m.currentState != nil { if err := m.currentState.Exit(); err != nil { return err } } if err := state.Enter(); err != nil { return err } m.currentState = state return nil } func (m *StateManager) Update() error { if m.currentState == nil { return nil } newState, err := m.currentState.Update() if err != nil { return err } if newState != nil { if err := m.ChangeState(newState); err != nil { return err } } return nil } func (m *StateManager) Draw(screen *ebiten.Image) { if m.currentState != nil { m.currentState.Draw(screen) } }