openquell/game/game.go

70 lines
1.4 KiB
Go
Raw Normal View History

2024-02-06 15:26:20 +01:00
package game
import (
"fmt"
2024-02-06 15:26:20 +01:00
"image"
"openquell/observers"
2024-02-06 15:26:20 +01:00
"github.com/hajimehoshi/ebiten/v2"
"github.com/mlange-42/arche/ecs"
)
type Game struct {
World *ecs.World
Bounds image.Rectangle
ScreenWidth, ScreenHeight int
Scenes map[int]Scene
2024-02-11 14:24:30 +01:00
Observer *observers.GameObserver
2024-02-06 15:26:20 +01:00
}
2024-02-11 14:24:30 +01:00
func NewGame(width, height, cellsize, startlevel int, startscene int) *Game {
2024-02-06 15:26:20 +01:00
world := ecs.NewWorld()
game := &Game{
Bounds: image.Rectangle{},
World: &world,
ScreenWidth: width,
ScreenHeight: height,
Scenes: map[int]Scene{},
2024-02-06 15:26:20 +01:00
}
observers.NewPlayerObserver(&world)
observers.NewParticleObserver(&world)
2024-02-11 14:24:30 +01:00
game.Observer = observers.NewGameObserver(&world, startlevel, width, height, cellsize)
game.Scenes[Play] = NewLevelScene(game, startlevel)
fmt.Println(game.World.Stats().String())
2024-02-06 15:26:20 +01:00
return game
}
func (game *Game) Update() error {
gameobserver := observers.GetGameObserver(game.World)
timer := gameobserver.StopTimer
if timer.IsReady() {
timer.Reset()
gameobserver.CurrentLevel++
gameobserver.Score++ // FIXME: use level.Score(), see TODO
}
2024-02-06 15:26:20 +01:00
for _, scene := range game.Scenes {
scene.Update()
}
timer.Update()
2024-02-06 15:26:20 +01:00
return nil
}
func (game *Game) Draw(screen *ebiten.Image) {
for _, scene := range game.Scenes {
scene.Draw(screen)
}
}
func (g *Game) Layout(newWidth, newHeight int) (int, int) {
return g.ScreenWidth, g.ScreenHeight
}