102 lines
2.0 KiB
Go
102 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]
|
|
}
|
|
}
|