Display overlay text in the UI

We still have fonts to do, so this is very ugly, but it at least shows
*something* on the screen now.
This commit is contained in:
2020-03-26 22:09:26 +00:00
parent a0fd653c24
commit e4ce932324
7 changed files with 107 additions and 34 deletions

View File

@@ -3,13 +3,16 @@ package ui
import (
"image"
"github.com/hajimehoshi/ebiten"
"github.com/hajimehoshi/ebiten/ebitenutil"
"code.ur.gs/lupine/ordoor/internal/menus"
)
func init() {
registerBuilder(menus.TypeStatic, registerStatic)
registerBuilder(menus.TypeHypertext, registerHypertext)
registerBuilder(menus.TypeOverlay, registerStatic)
registerBuilder(menus.TypeOverlay, registerOverlay)
registerBuilder(menus.TypeAnimationSample, registerAnimation)
}
@@ -21,6 +24,9 @@ type noninteractive struct {
frames animation
rect image.Rectangle
// Some non-interactives, e.g., overlays, are an image + text to be shown
textImg *ebiten.Image
hoverImpl
}
@@ -38,7 +44,7 @@ func registerStatic(d *Driver, r *menus.Record) error {
ni := &noninteractive{
frames: animation{sprite.Image},
hoverImpl: hoverImpl{text: r.Desc},
hoverImpl: hoverImpl{text: r.Text},
rect: sprite.Rect,
}
@@ -55,8 +61,7 @@ func registerHypertext(d *Driver, r *menus.Record) error {
}
ni := &noninteractive{
frames: nil,
hoverImpl: hoverImpl{text: r.Desc},
hoverImpl: hoverImpl{text: r.Text},
rect: sprite.Rect,
}
@@ -65,6 +70,34 @@ func registerHypertext(d *Driver, r *menus.Record) error {
return nil
}
// An overlay is a static image + some text that needs to be rendered
func registerOverlay(d *Driver, r *menus.Record) error {
sprite, err := d.menu.Sprite(r.Share)
if err != nil {
return err
}
ni := &noninteractive{
frames: animation{sprite.Image},
rect: sprite.Rect,
}
if r.Text != "" {
// FIXME: we should be rendering the text much more nicely than this
textImg, err := ebiten.NewImage(sprite.Rect.Dx(), sprite.Rect.Dy(), ebiten.FilterDefault)
if err != nil {
return err
}
ebitenutil.DebugPrint(textImg, r.Text)
ni.textImg = textImg
}
d.paintables = append(d.paintables, ni)
return nil
}
// An animation is a non-interactive element that displays something in a loop
func registerAnimation(d *Driver, r *menus.Record) error {
sprite, err := d.menu.Sprite(r.SpriteId[0])
@@ -79,7 +112,7 @@ func registerAnimation(d *Driver, r *menus.Record) error {
ani := &noninteractive{
frames: animation(frames),
hoverImpl: hoverImpl{text: r.Desc},
hoverImpl: hoverImpl{text: r.Text},
rect: sprite.Rect,
}
@@ -94,5 +127,11 @@ func (n *noninteractive) bounds() image.Rectangle {
}
func (n *noninteractive) regions(tick int) []region {
return oneRegion(n.bounds().Min, n.frames.image(tick))
out := oneRegion(n.bounds().Min, n.frames.image(tick))
if n.textImg != nil {
out = append(out, oneRegion(n.bounds().Min, n.textImg)...)
}
return out
}