70 lines
1.4 KiB
Go
70 lines
1.4 KiB
Go
package game
|
|
|
|
import (
|
|
"fmt"
|
|
"image"
|
|
"openquell/observers"
|
|
|
|
"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
|
|
Observer *observers.GameObserver
|
|
}
|
|
|
|
func NewGame(width, height, cellsize, startlevel int, startscene int) *Game {
|
|
world := ecs.NewWorld()
|
|
|
|
game := &Game{
|
|
Bounds: image.Rectangle{},
|
|
World: &world,
|
|
ScreenWidth: width,
|
|
ScreenHeight: height,
|
|
Scenes: map[int]Scene{},
|
|
}
|
|
|
|
observers.NewPlayerObserver(&world)
|
|
observers.NewParticleObserver(&world)
|
|
game.Observer = observers.NewGameObserver(&world, startlevel, width, height, cellsize)
|
|
|
|
game.Scenes[Play] = NewLevelScene(game, startlevel)
|
|
|
|
fmt.Println(game.World.Stats().String())
|
|
|
|
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
|
|
}
|
|
|
|
for _, scene := range game.Scenes {
|
|
scene.Update()
|
|
}
|
|
|
|
timer.Update()
|
|
|
|
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
|
|
}
|