Files
groovy/manager.go
2023-08-21 08:04:25 -04:00

107 lines
2.0 KiB
Go

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
}