1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2024-10-04 09:15:09 -04:00
OpenDiablo2/d2core/d2scene/d2scene.go

89 lines
1.8 KiB
Go
Raw Normal View History

package d2scene
import (
2020-02-08 21:02:37 -05:00
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2gui"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2ui"
)
2020-02-08 21:02:37 -05:00
type Scene interface{}
2020-02-08 21:02:37 -05:00
type SceneLoadHandler interface {
OnLoad() error
}
2020-02-08 21:02:37 -05:00
type SceneUnloadHandler interface {
OnUnload() error
}
2020-02-08 21:02:37 -05:00
type SceneRenderHandler interface {
Render(target d2render.Surface) error
}
2020-02-08 21:02:37 -05:00
type SceneAdvanceHandler interface {
Advance(elapsed float64) error
}
2020-02-08 21:02:37 -05:00
var singleton struct {
nextScene Scene
loadingScene Scene
currentScene Scene
}
2020-02-08 21:02:37 -05:00
func SetNextScene(scene Scene) {
singleton.nextScene = scene
}
2020-02-08 21:02:37 -05:00
func Advance(elapsed float64) error {
if singleton.nextScene != nil {
if handler, ok := singleton.currentScene.(SceneUnloadHandler); ok {
if err := handler.OnUnload(); err != nil {
return err
}
}
2020-02-08 21:02:37 -05:00
d2ui.Reset()
d2gui.Clear()
2020-02-08 21:02:37 -05:00
if _, ok := singleton.nextScene.(SceneLoadHandler); ok {
d2gui.ShowLoadScreen(0)
d2gui.HideCursor()
singleton.currentScene = nil
singleton.loadingScene = singleton.nextScene
} else {
singleton.currentScene = singleton.nextScene
singleton.loadingScene = nil
}
2020-02-08 21:02:37 -05:00
singleton.nextScene = nil
} else if singleton.loadingScene != nil {
handler := singleton.loadingScene.(SceneLoadHandler)
if err := handler.OnLoad(); err != nil {
return err
}
singleton.currentScene = singleton.loadingScene
singleton.loadingScene = nil
d2gui.ShowCursor()
d2gui.HideLoadScreen()
} else if singleton.currentScene != nil {
if handler, ok := singleton.currentScene.(SceneAdvanceHandler); ok {
if err := handler.Advance(elapsed); err != nil {
return err
}
}
}
return nil
}
2020-02-08 21:02:37 -05:00
func Render(surface d2render.Surface) error {
if handler, ok := singleton.currentScene.(SceneRenderHandler); ok {
if err := handler.Render(surface); err != nil {
return err
}
}
return nil
}