90 lines
1.8 KiB
Go
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()
|
|
}
|