70 lines
1.2 KiB
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
|
|
}
|