From f2b3f371c4ead738a237fe4fa345d04514047d80 Mon Sep 17 00:00:00 2001 From: iegod Date: Mon, 21 Aug 2023 08:04:25 -0400 Subject: [PATCH] Module'd up. --- manager.go | 106 +++++++++++++++++++++++++++++++++++++++++++++++++++++ scene.go | 9 +++++ 2 files changed, 115 insertions(+) create mode 100644 manager.go create mode 100644 scene.go diff --git a/manager.go b/manager.go new file mode 100644 index 0000000..084b3fa --- /dev/null +++ b/manager.go @@ -0,0 +1,106 @@ +package groovy + +import ( + "os" + + "github.com/hajimehoshi/ebiten/v2" +) + +const ( + defaultWidth = 1024 + defaultHeight = 768 +) + +type Area struct { + Width int + Height int +} + +type GameInfo struct { + Name string + Version string + Dimension Area +} + +type Manager struct { + Info GameInfo + currentScene Scene + currentSceneId int + scenes []Scene +} + +// can be used to create default manager instance +func NewManager() Manager { + return Manager{ + Info: GameInfo{ + Name: "groovy", + Version: "1.0", + Dimension: Area{ + Width: defaultWidth, + Height: defaultHeight}, + }, + currentSceneId: 0, + } +} + +// ebitengine update proxy +// manages scene transition and exists, then calls scene's update method +func (m *Manager) Update() error { + if m.currentScene == nil { + return nil + } + + m.CheckTransitions() + m.CheckExit() + + //call the current scene's update method + return m.currentScene.Update() + +} + +// check for exit condition +func (m *Manager) CheckExit() { + if m.currentSceneId >= len(m.scenes) { + os.Exit(0) + } +} + +// check for scene completion and if reached, set up next scene (if available) +func (m *Manager) CheckTransitions() { + if m.currentScene.Completed() { + m.currentSceneId++ + if m.currentSceneId < len(m.scenes) { + m.currentScene = m.scenes[m.currentSceneId] + } + } +} + +// calls current scene's draw method if the currentscene is valid +func (m *Manager) Draw(screen *ebiten.Image) { + if m.currentScene != nil { + m.currentScene.Draw(screen) + } +} + +// ebitengine proxy for layout +func (m *Manager) Layout(outsideWidth, outsideHeight int) (screenWidth, screenHeight int) { + return m.Info.Dimension.Width, m.Info.Dimension.Height +} + +// appends scene to the managed scenes +func (m *Manager) AddScene(s Scene) { + m.scenes = append(m.scenes, s) +} + +// sets the current scene, based on sceneindex +func (m *Manager) SetCurrentScene(sceneId int) { + if sceneId >= 0 && sceneId < len(m.scenes) { + m.currentSceneId = sceneId + m.currentScene = m.scenes[m.currentSceneId] + } +} + +// check for exit condition +func (m *Manager) SetDimensions(a Area) { + m.Info.Dimension = a +} diff --git a/scene.go b/scene.go new file mode 100644 index 0000000..1044db7 --- /dev/null +++ b/scene.go @@ -0,0 +1,9 @@ +package groovy + +import "github.com/hajimehoshi/ebiten/v2" + +type Scene interface { + Update() error + Draw(screen *ebiten.Image) + Completed() bool +}