From 08defeeded29a74fde39871f3317017e4df80c94 Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Sun, 13 Feb 2022 20:02:49 +0900 Subject: [PATCH] internal/ui: move more logics to internal/ui --- internal/ui/context.go | 27 +++++++++++++++++++++++++-- internal/ui/ui_cbackend.go | 2 +- internal/ui/ui_glfw.go | 2 +- internal/ui/ui_js.go | 2 +- internal/ui/ui_mobile.go | 2 +- uicontext.go | 25 ++++--------------------- 6 files changed, 33 insertions(+), 27 deletions(-) diff --git a/internal/ui/context.go b/internal/ui/context.go index c2617d4ef..ca323e267 100644 --- a/internal/ui/context.go +++ b/internal/ui/context.go @@ -23,18 +23,22 @@ import ( "github.com/hajimehoshi/ebiten/v2/internal/clock" "github.com/hajimehoshi/ebiten/v2/internal/debug" graphicspkg "github.com/hajimehoshi/ebiten/v2/internal/graphics" + "github.com/hajimehoshi/ebiten/v2/internal/hooks" ) const DefaultTPS = 60 type Context interface { UpdateOffscreen(outsideWidth, outsideHeight float64, deviceScaleFactor float64) (int, int) - UpdateFrame(updateCount int, screenScale float64, offsetX, offsetY float64) error + UpdateGame() error + DrawGame(screenScale float64, offsetX, offsetY float64) error } type contextImpl struct { context Context + updateCalled bool + // The following members must be protected by the mutex m. outsideWidth float64 outsideHeight float64 @@ -75,8 +79,27 @@ func (c *contextImpl) updateFrameImpl(updateCount int, deviceScaleFactor float64 return err } + // Ensure that Update is called once before Draw so that Update can be used for initialization. + if !c.updateCalled && updateCount == 0 { + updateCount = 1 + c.updateCalled = true + } + debug.Logf("Update count per frame: %d\n", updateCount) + + // Update the game. + for i := 0; i < updateCount; i++ { + if err := hooks.RunBeforeUpdateHooks(); err != nil { + return err + } + if err := c.context.UpdateGame(); err != nil { + return err + } + Get().resetForTick() + } + + // Draw the game. screenScale, offsetX, offsetY := c.screenScaleAndOffsets(deviceScaleFactor) - if err := c.context.UpdateFrame(updateCount, screenScale, offsetX, offsetY); err != nil { + if err := c.context.DrawGame(screenScale, offsetX, offsetY); err != nil { return err } diff --git a/internal/ui/ui_cbackend.go b/internal/ui/ui_cbackend.go index 2323a74c4..924403b2e 100644 --- a/internal/ui/ui_cbackend.go +++ b/internal/ui/ui_cbackend.go @@ -74,7 +74,7 @@ func (*UserInterface) ScreenSizeInFullscreen() (int, int) { return 0, 0 } -func (*UserInterface) ResetForTick() { +func (*UserInterface) resetForTick() { } func (*UserInterface) CursorMode() CursorMode { diff --git a/internal/ui/ui_glfw.go b/internal/ui/ui_glfw.go index 4ae220301..d09ee94af 100644 --- a/internal/ui/ui_glfw.go +++ b/internal/ui/ui_glfw.go @@ -1349,7 +1349,7 @@ func (u *UserInterface) IsScreenTransparent() bool { return val } -func (u *UserInterface) ResetForTick() { +func (u *UserInterface) resetForTick() { u.input.resetForTick() u.m.Lock() diff --git a/internal/ui/ui_js.go b/internal/ui/ui_js.go index 28e7c9617..36519f699 100644 --- a/internal/ui/ui_js.go +++ b/internal/ui/ui_js.go @@ -636,7 +636,7 @@ func (u *UserInterface) IsScreenTransparent() bool { return bodyStyle.Get("backgroundColor").Equal(stringTransparent) } -func (u *UserInterface) ResetForTick() { +func (u *UserInterface) resetForTick() { u.input.resetForTick() } diff --git a/internal/ui/ui_mobile.go b/internal/ui/ui_mobile.go index d13cb6862..11baecc3b 100644 --- a/internal/ui/ui_mobile.go +++ b/internal/ui/ui_mobile.go @@ -431,7 +431,7 @@ func (u *UserInterface) IsScreenTransparent() bool { return false } -func (u *UserInterface) ResetForTick() { +func (u *UserInterface) resetForTick() { u.input.resetForTick() } diff --git a/uicontext.go b/uicontext.go index dc012ce83..49d478fcc 100644 --- a/uicontext.go +++ b/uicontext.go @@ -18,9 +18,7 @@ import ( "fmt" "sync" - "github.com/hajimehoshi/ebiten/v2/internal/debug" "github.com/hajimehoshi/ebiten/v2/internal/graphicsdriver" - "github.com/hajimehoshi/ebiten/v2/internal/hooks" "github.com/hajimehoshi/ebiten/v2/internal/ui" ) @@ -29,8 +27,6 @@ type uiContext struct { offscreen *Image screen *Image - updateCalled bool - m sync.Mutex } @@ -88,24 +84,11 @@ func (c *uiContext) setScreenClearedEveryFrame(cleared bool) { } } -func (c *uiContext) UpdateFrame(updateCount int, screenScale float64, offsetX, offsetY float64) error { - // Ensure that Update is called once before Draw so that Update can be used for initialization. - if !c.updateCalled && updateCount == 0 { - updateCount = 1 - c.updateCalled = true - } - debug.Logf("Update count per frame: %d\n", updateCount) - - for i := 0; i < updateCount; i++ { - if err := hooks.RunBeforeUpdateHooks(); err != nil { - return err - } - if err := c.game.Update(); err != nil { - return err - } - ui.Get().ResetForTick() - } +func (c *uiContext) UpdateGame() error { + return c.game.Update() +} +func (c *uiContext) DrawGame(screenScale float64, offsetX, offsetY float64) error { // Even though updateCount == 0, the offscreen is cleared and Draw is called. // Draw should not update the game state and then the screen should not be updated without Update, but // users might want to process something at Draw with the time intervals of FPS.