mirror of
https://github.com/OpenDiablo2/OpenDiablo2
synced 2024-10-06 02:03:57 -04:00
126 lines
2.5 KiB
Go
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()
|
||
|
}
|