diff --git a/pkg/engine/engine.go b/pkg/engine/engine.go new file mode 100644 index 0000000..71a1057 --- /dev/null +++ b/pkg/engine/engine.go @@ -0,0 +1,59 @@ +package engine + +import "time" + +type Engine struct { + isRunning bool + window *Window + 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 = 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.SwapBuffers() + } +} diff --git a/pkg/engine/game.go b/pkg/engine/game.go new file mode 100644 index 0000000..2024bdf --- /dev/null +++ b/pkg/engine/game.go @@ -0,0 +1,8 @@ +package engine + +type Game interface { + Init() error + Update(deltaTime float32) + Draw(renderer *Renderer) + OnResize(width, height int) +}