1
0
Fork 0

refactor: move ui code from game/state/handlers/menu.go to its own package in game/ui

This commit is contained in:
Henrik Hautakoski 2025-10-19 11:36:12 +02:00
parent 5204166ea1
commit 5f82162201
5 changed files with 118 additions and 45 deletions

View file

@ -2,59 +2,39 @@ package handlers
import (
"tetris/assets"
"tetris/engine/audio"
"tetris/engine/render"
"tetris/game"
"tetris/game/state"
"tetris/game/ui"
rl "github.com/gen2brain/raylib-go/raylib"
)
type entry struct {
label string
state string
type MainMenu struct {
menu ui.Menu
}
type Menu struct {
selected int
entries []entry
}
func NewMenu() *Menu {
return &Menu{
selected: 0,
entries: []entry{
{"Start", "gameplay"},
{"Quit", "quit"},
},
func NewMainMenu(fsm state.Transitioner) *MainMenu {
return &MainMenu{
menu: ui.NewMenu([]ui.Widget{
ui.NewButton("Start", func() { fsm.Switch("gameplay") }),
ui.NewButton("Quit", func() { fsm.Switch("quit") }),
}),
}
}
func (menu *Menu) Enter() {
menu.selected = 0
func (main *MainMenu) Enter() {
main.menu.Select(0)
}
func (Menu) Exit() {
func (MainMenu) Exit() {
}
func (menu *Menu) Update(fsm state.Transitioner, delta float32) {
if rl.IsKeyPressed(rl.KeyEnter) {
fsm.Switch(menu.entries[menu.selected].state)
audio.Play(assets.SFX_MENU_ENTER)
} else if rl.IsKeyPressed(rl.KeyDown) {
if menu.selected+1 < len(menu.entries) {
menu.selected = menu.selected + 1
audio.Play(assets.SFX_MENU_SELECT)
}
} else if rl.IsKeyPressed(rl.KeyUp) {
if menu.selected-1 >= 0 {
menu.selected = menu.selected - 1
audio.Play(assets.SFX_MENU_SELECT)
}
}
func (menu *MainMenu) Update(fsm state.Transitioner, delta float32) {
menu.menu.HandleInput()
}
func (Menu) renderLogo(offset_x, offset_y int32) {
func (MainMenu) renderLogo(offset_x, offset_y int32) {
for y := range assets.LOGO_HEIGHT {
for x := range assets.LOGO_STRIDE {
index := assets.Logo[x+(y*assets.LOGO_STRIDE)]
@ -76,20 +56,15 @@ func (Menu) renderLogo(offset_x, offset_y int32) {
}
}
func (menu Menu) renderEntries(offset_x, offset_y int32) {
func (menu MainMenu) renderEntries(offset_x, offset_y int32) {
y := offset_y
for i, entry := range menu.entries {
col := rl.White
if i == menu.selected {
col = rl.Red
}
render.DrawTextCenter(offset_x, y, 32, entry.label, col)
for i, entry := range menu.menu.Entries() {
entry.Draw(offset_x, y, menu.menu.IsSelected(i))
y += 40
}
}
func (menu Menu) Render() {
func (menu MainMenu) Render() {
render.Begin(rl.Black)
menu.renderLogo(20, 150)