diff --git a/game/state/handlers/menu.go b/game/state/handlers/menu.go index ef5b389..c8b51ca 100644 --- a/game/state/handlers/menu.go +++ b/game/state/handlers/menu.go @@ -2,6 +2,7 @@ package handlers import ( "tetris/assets" + "tetris/engine/audio" "tetris/engine/render" "tetris/game" "tetris/game/state" @@ -17,19 +18,26 @@ type MainMenu struct { list *layouts.ListBox } +func enterState(fsm state.Transitioner, state string) func() { + return func() { + audio.Play(assets.SFX_MENU_ENTER) + fsm.Switch(state) + } +} + func NewMainMenu(fsm state.Transitioner) *MainMenu { return &MainMenu{ list: layouts.NewListBox([]ui.InputWidget{ - widgets.NewButton("Start", 32, func() { fsm.Switch("gameplay") }), - widgets.NewButton("Options", 32, func() { fsm.Switch("options") }), - widgets.NewButton("Quit", 32, func() { fsm.Switch("quit") }), + widgets.NewButton("Start", 32, enterState(fsm, "gameplay")), + widgets.NewButton("Options", 32, enterState(fsm, "options")), + widgets.NewButton("Quit", 32, enterState(fsm, "quit")), }).Spacing(10). OnSelect(uievents.MenuSelect), } } func (main *MainMenu) Enter() { - main.list.Select(0) + main.list.SetSelected(0) } func (MainMenu) Exit() { diff --git a/game/ui/layouts/list_box.go b/game/ui/layouts/list_box.go index 4a058cf..bcbcd08 100644 --- a/game/ui/layouts/list_box.go +++ b/game/ui/layouts/list_box.go @@ -42,12 +42,19 @@ func (lb ListBox) Entries() []ui.InputWidget { } func (lb *ListBox) Select(index int) { + if lb.SetSelected(index) { + lb.onSelect() + } +} + +func (lb *ListBox) SetSelected(index int) bool { if index >= 0 && index < len(lb.entries) { lb.entries[lb.selected].SetFocus(false) lb.selected = index lb.entries[lb.selected].SetFocus(true) - lb.onSelect() + return true } + return false } func (lb ListBox) Selected() ui.InputWidget {