try write game engine
This commit is contained in:
parent
a101afcd15
commit
f990b270f9
59
pkg/engine/engine.go
Normal file
59
pkg/engine/engine.go
Normal file
@ -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()
|
||||
}
|
||||
}
|
||||
8
pkg/engine/game.go
Normal file
8
pkg/engine/game.go
Normal file
@ -0,0 +1,8 @@
|
||||
package engine
|
||||
|
||||
type Game interface {
|
||||
Init() error
|
||||
Update(deltaTime float32)
|
||||
Draw(renderer *Renderer)
|
||||
OnResize(width, height int)
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user