1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2024-10-06 02:03:57 -04:00
OpenDiablo2/d2core/d2gui/gui_manager.go
2020-02-08 21:02:37 -05:00

126 lines
2.5 KiB
Go

package d2gui
import (
"image/color"
"math"
"github.com/OpenDiablo2/OpenDiablo2/d2common/d2resource"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2input"
"github.com/OpenDiablo2/OpenDiablo2/d2core/d2render"
)
type guiWidget interface {
getLayer() int
render(target d2render.Surface) error
advance(elapsed float64) error
}
type guiManager struct {
cursorSprite *Sprite
loadSprite *Sprite
widgets []guiWidget
loading bool
}
func createGuiManager() (*guiManager, error) {
cursorSprite, err := CreateSprite(d2resource.CursorDefault, d2resource.PaletteUnits)
if err != nil {
return nil, err
}
loadSprite, err := CreateSprite(d2resource.LoadingScreen, d2resource.PaletteLoading)
if err != nil {
return nil, err
}
width, height := loadSprite.getSize()
loadSprite.SetPosition(400-width/2, 300+height/2)
manager := &guiManager{
cursorSprite: cursorSprite,
loadSprite: loadSprite,
}
if err := d2input.BindHandler(manager); err != nil {
return nil, err
}
return manager, nil
}
func (gui *guiManager) OnMouseMove(event d2input.MouseMoveEvent) bool {
gui.cursorSprite.SetPosition(event.X, event.Y)
return false
}
func (gui *guiManager) render(target d2render.Surface) error {
if gui.loading {
target.Clear(color.Black)
if err := gui.loadSprite.render(target); err != nil {
return err
}
} else {
for _, widget := range gui.widgets {
if err := widget.render(target); err != nil {
return err
}
}
}
if err := gui.cursorSprite.render(target); err != nil {
return err
}
return nil
}
func (gui *guiManager) advance(elapsed float64) error {
if gui.loading {
gui.loadSprite.Show()
if err := gui.loadSprite.advance(elapsed); err != nil {
return err
}
} else {
gui.loadSprite.Hide()
for _, widget := range gui.widgets {
if err := widget.advance(elapsed); err != nil {
return err
}
}
}
if err := gui.loadSprite.advance(elapsed); err != nil {
return err
}
return nil
}
func (gui *guiManager) showLoadScreen(progress float64) {
progress = math.Min(progress, 1.0)
progress = math.Max(progress, 0.0)
animation := gui.loadSprite.animation
frameCount := animation.GetFrameCount()
animation.SetCurrentFrame(int(float64(frameCount-1.0) * progress))
gui.loading = true
}
func (gui *guiManager) hideLoadScreen() {
gui.loading = false
}
func (gui *guiManager) showCursor() {
gui.cursorSprite.Show()
}
func (gui *guiManager) hideCursor() {
gui.cursorSprite.Hide()
}
func (gui *guiManager) clear() {
gui.widgets = nil
gui.hideLoadScreen()
}