Files
golsky/cmd/game.go

83 lines
2.1 KiB
Go
Raw Permalink Normal View History

2025-11-13 21:30:44 +01:00
package cmd
2024-05-28 13:37:32 +02:00
import (
"github.com/hajimehoshi/ebiten/v2"
)
type Game struct {
ScreenWidth, ScreenHeight, ReadlWidth, Cellsize int
Scenes map[SceneName]Scene
CurrentScene SceneName
Config *Config
Scale float32
}
func NewGame(config *Config, startscene SceneName) *Game {
game := &Game{
Config: config,
Scenes: map[SceneName]Scene{},
ScreenWidth: config.ScreenWidth,
ScreenHeight: config.ScreenHeight,
}
2024-05-26 13:08:36 +02:00
// setup scene[s]
game.CurrentScene = startscene
game.Scenes[Play] = NewPlayScene(game, config)
game.Scenes[Menu] = NewMenuScene(game, config)
game.Scenes[Options] = NewOptionsScene(game, config)
game.Scenes[Keybindings] = NewKeybindingsScene(game, config)
2024-05-26 13:08:36 +02:00
// setup environment
ebiten.SetWindowSize(game.ScreenWidth, game.ScreenHeight)
ebiten.SetWindowTitle("golsky - conway's game of life")
ebiten.SetWindowResizingMode(ebiten.WindowResizingModeEnabled)
2024-05-31 21:20:13 +02:00
ebiten.SetScreenClearedEveryFrame(true)
return game
}
func (game *Game) GetCurrentScene() Scene {
return game.Scenes[game.CurrentScene]
2024-05-24 17:53:38 +02:00
}
func (game *Game) Layout(outsideWidth, outsideHeight int) (int, int) {
game.ReadlWidth = outsideWidth
game.Scale = float32(game.ScreenWidth) / float32(outsideWidth)
return game.ScreenWidth, game.ScreenHeight
2024-05-24 20:27:08 +02:00
}
func (game *Game) Update() error {
scene := game.GetCurrentScene()
if quit := scene.Update(); quit != nil {
return quit
}
2024-05-24 20:27:08 +02:00
next := scene.GetNext()
if next != game.CurrentScene {
game.Scenes[next].SetPrevious(game.CurrentScene)
scene.ResetNext()
game.CurrentScene = next
}
return nil
}
func (game *Game) Draw(screen *ebiten.Image) {
// first draw primary scene[s], although there are only 1
for current, scene := range game.Scenes {
if scene.IsPrimary() {
// primary scenes always draw
scene.Draw(screen)
if current == game.CurrentScene {
// avoid to redraw it in the next step
return
}
}
}
scene := game.GetCurrentScene()
scene.Draw(screen)
}