Files
2026-08-22 16:33:18 +02:00

90 lines
1.8 KiB
Go

package components
import (
"fmt"
"os"
"github.com/UnintendedFraud/snake-game/components/buttons"
"github.com/hajimehoshi/ebiten/v2"
"github.com/hajimehoshi/ebiten/v2/inpututil"
"github.com/hajimehoshi/ebiten/v2/text/v2"
)
type Menu struct {
focusedIdx int
buttons []buttons.MenuButton
img *ebiten.Image
}
func InitMenu() *Menu {
return &Menu{
img: ebiten.NewImage(200, 200),
focusedIdx: 0,
buttons: []buttons.MenuButton{
{
Value: "start game",
Action: buttons.StartGame,
},
{
Value: "exit game",
Action: buttons.ExitGame,
},
},
}
}
func (m *Menu) Click(game *Game) {
if inpututil.IsKeyJustPressed(ebiten.KeyEnter) ||
inpututil.IsKeyJustPressed(ebiten.KeyKPEnter) {
m.executeAction(game, m.buttons[m.focusedIdx].Action)
}
}
func (m *Menu) executeAction(game *Game, action buttons.MenuAction) {
switch action {
case buttons.StartGame:
game.snake = InitSnake(WINDOW_WIDTH, WINDOW_HEIGHT)
game.state = Playing
case buttons.ExitGame:
fmt.Println("Closing the game")
os.Exit(0)
}
}
func (m *Menu) UpdateFocus() {
if inpututil.IsKeyJustPressed(ebiten.KeyUp) {
if m.focusedIdx != 0 {
m.focusedIdx--
}
}
if inpututil.IsKeyJustPressed(ebiten.KeyDown) {
if m.focusedIdx != len(m.buttons)-1 {
m.focusedIdx++
}
}
}
func (m *Menu) Render(screen *ebiten.Image, font *text.GoTextFaceSource) {
m.Clear()
for idx, b := range m.buttons {
menuImg := b.GetMenuButtonImg(font, 24, m.focusedIdx == idx)
x := float64(0)
y := float64(idx*50 + 50)
menuImgOp := &ebiten.DrawImageOptions{}
menuImgOp.GeoM.Translate(x, y)
m.img.DrawImage(menuImg, menuImgOp)
}
imgOp := &ebiten.DrawImageOptions{}
imgOp.GeoM.Translate(150, 200)
screen.DrawImage(m.img, imgOp)
}
func (m *Menu) Clear() {
m.img.Clear()
}