1
0
Fork 0
tetris-go/game/state/handlers/options.go

67 lines
1.4 KiB
Go

package handlers
import (
"tetris/assets"
"tetris/engine/audio"
"tetris/engine/core"
"tetris/engine/render"
"tetris/game"
"tetris/game/state"
"tetris/game/ui"
"tetris/game/ui/layouts"
"tetris/game/ui/widgets"
"tetris/game/uievents"
rl "github.com/gen2brain/raylib-go/raylib"
)
type OptionsMenu struct {
sndVolume *widgets.Slider
list *layouts.ListBox
}
func soundVolumeChanged(widget *widgets.Slider) {
value := core.ByteToClampedFloat32(byte(widget.Value))
audio.SetVolume(value)
audio.Play(assets.SFX_MENU_SOUND_VOLUME_SELECT)
// Store in config and save
game.Config.SoundVolume = byte(widget.Value)
game.Config.Save()
}
func NewOptionsMenu() *OptionsMenu {
sndVolume := widgets.NewSlider(0, 255, 10).WithOnChange(soundVolumeChanged)
return &OptionsMenu{
sndVolume: sndVolume,
list: layouts.NewListBox([]ui.InputWidget{
layouts.NewInputControl(widgets.NewLabel("Sound Volume", 16), sndVolume),
}).Spacing(10).OnSelect(uievents.MenuSelect),
}
}
func (menu *OptionsMenu) Enter() {
vol := core.ClampedFloat32ToByte(audio.Volume())
menu.sndVolume.SetValue(int(vol))
}
func (OptionsMenu) Exit() {
}
func (menu *OptionsMenu) Update(fsm state.Transitioner, delta float32) {
if rl.IsKeyPressed(rl.KeyEscape) {
fsm.Switch("menu")
} else {
menu.list.HandleInput()
}
}
func (opt OptionsMenu) Render() {
render.Begin(rl.Black)
render.DrawTextCenter(340, 100, 32, "Options", rl.White)
opt.list.Draw(150, 200)
render.End()
}