package components import ( "image/color" "os" "github.com/hajimehoshi/ebiten/v2" "github.com/hajimehoshi/ebiten/v2/text/v2" ) const ( WindowWidth int = 500 WindowHeight int = 500 ) type GameState int const ( MainMenu GameState = iota Playing Dead Won ) type Game struct { font *text.GoTextFaceSource titleImg *ebiten.Image state GameState snake *Snake menu *Menu } func InitGame() *Game { ebiten.SetWindowSize(WindowWidth, WindowHeight) ebiten.SetWindowTitle("Snake") fontFile, err := os.Open("fonts/rockers_garage.ttf") if err != nil { panic(err) } font, err := text.NewGoTextFaceSource(fontFile) if err != nil { panic(err) } return &Game{ font: font, titleImg: initTitle(font), state: MainMenu, snake: InitSnake(WindowWidth, WindowHeight), menu: InitMenu(), } } func (g *Game) Update() error { switch g.state { case MainMenu: g.menu.UpdateFocus() g.menu.Click(g) case Playing: g.snake.Eat() g.snake.Sprint() g.snake.ManageDirection() g.snake.Move() if g.snake.HasCollided() { g.state = Dead // g.snake.isDead = true } if g.snake.score == g.snake.total { g.state = Won // g.snake.hasWon = true } // if g.snake.isDead || g.snake.hasWon { // g.snake.Click(g) // } case Dead, Won: g.snake.Click(g) } return nil } func (g *Game) Draw(screen *ebiten.Image) { screen.DrawImage(g.titleImg, &ebiten.DrawImageOptions{}) switch g.state { case MainMenu: g.menu.Render(screen, g.font) case Playing: g.snake.Render(screen, g.font) case Won: g.snake.renderWinScreen(screen, g.font) case Dead: g.snake.renderDeadScreen(screen, g.font) } } func (g *Game) Layout(outsideWith, outsideHeight int) (screenWidth, screenHeight int) { return WindowWidth, WindowHeight } func initTitle(font *text.GoTextFaceSource) *ebiten.Image { face := &text.GoTextFace{ Source: font, Size: 30, } titleW, _ := text.Measure("snake", face, 0) fontOptions := &text.DrawOptions{} fontOptions.GeoM.Translate(float64(WindowWidth)/2-titleW/2, 10) fontOptions.ColorScale.ScaleWithColor(color.RGBA{194, 169, 60, 1}) h := float64(WindowHeight) * 0.1 titleImg := ebiten.NewImage(WindowWidth, int(h)) text.Draw(titleImg, "snake", face, fontOptions) return titleImg }