art3de/pkg/engine/engine.go

70 lines
1.2 KiB
Go

package engine
import (
"time"
"git.influ.su/artmares/art3de/pkg/engine/renderer"
)
type Engine struct {
isRunning bool
window *Window
renderer *renderer.Renderer
lastTime time.Time
game Game
}
func NewEngine(title string, width, height int) *Engine {
return &Engine{
window: NewWindow(title, width, height),
}
}
func (e *Engine) Run(game Game) error {
e.game = game
if err := e.window.Init(); err != nil {
return err
}
defer e.window.Destroy()
e.renderer = renderer.NewRenderer()
if err := e.renderer.Init(); err != nil {
return err
}
if err := e.game.Init(); err != nil {
return err
}
e.isRunning = true
e.lastTime = time.Now()
// Основной игровой цикл
for e.isRunning && !e.window.ShouldClose() {
// Обработка событий
e.window.PollEvents()
// Расчет времени кадра
currentTime := time.Now()
deltaTime := currentTime.Sub(e.lastTime).Seconds()
e.lastTime = currentTime
// Обновление игры
e.game.Update(float32(deltaTime))
// Рендеринг
e.renderer.Clear()
e.game.Draw(e.renderer)
// Отображение буфера
e.window.SwapBuffers()
}
return nil
}
func (e *Engine) Stop() {
e.isRunning = false
}