last_light/game/game_context.go

61 lines
983 B
Go
Raw Normal View History

package game
import (
"log"
2024-05-06 20:43:35 +03:00
"mvvasilev/last_light/engine"
"os"
"time"
)
const TICK_RATE int64 = 50 // tick every 50ms ( 20 ticks per second )
type GameContext struct {
2024-05-06 20:43:35 +03:00
renderContext *engine.RenderContext
game *Game
}
func CreateGameContext() *GameContext {
gc := new(GameContext)
2024-05-06 20:43:35 +03:00
rc, err := engine.CreateRenderContext()
if err != nil {
log.Fatalf("%~v", err)
}
gc.renderContext = rc
gc.game = CreateGame()
return gc
}
func (gc *GameContext) Run() {
2024-05-06 18:59:14 +03:00
lastLoop := time.Now()
lastTick := time.Now()
for {
2024-05-06 18:59:14 +03:00
deltaTime := 1 + time.Since(lastLoop).Microseconds()
lastLoop = time.Now()
for _, e := range gc.renderContext.CollectInputEvents() {
gc.game.Input(e)
}
2024-05-06 18:59:14 +03:00
if time.Since(lastTick).Milliseconds() >= TICK_RATE {
stop := !gc.game.Tick(deltaTime)
2024-05-06 18:59:14 +03:00
if stop {
gc.renderContext.Stop()
os.Exit(0)
break
}
lastTick = time.Now()
}
drawables := gc.game.CollectDrawables()
gc.renderContext.Draw(deltaTime, drawables)
}
}