commandeuropa/system/renderselection.go

61 lines
2.1 KiB
Go

package system
import (
"image/color"
"code.rocketnine.space/tslocum/commandeuropa/component"
"code.rocketnine.space/tslocum/commandeuropa/world"
"code.rocketnine.space/tslocum/gohan"
"github.com/hajimehoshi/ebiten/v2"
)
type RenderSelection struct {
Unit *component.Unit
Position *component.Position
Sprite *component.Sprite
op *ebiten.DrawImageOptions
initialized bool
}
func (r *RenderSelection) Initialize() {
r.op = &ebiten.DrawImageOptions{}
}
func (r *RenderSelection) Update(e gohan.Entity) error {
return gohan.ErrUnregister
}
func (r *RenderSelection) Draw(e gohan.Entity, screen *ebiten.Image) error {
if !r.initialized {
r.Initialize()
}
if !r.Unit.Selected {
return nil
}
dx, dy := world.LevelCoordinatesToScreen(r.Position.X, r.Position.Y)
drawHighlight(screen, dx, dy, r.Sprite.Width, r.Sprite.Height)
return nil
}
func drawHighlight(target *ebiten.Image, x, y, w, h float64) {
right, bottom := x+w*world.CamScale, y+h*world.CamScale
outerColor := color.RGBA{0, 0, 0, 255}
outerSize := 3 * world.CamScale
target.SubImage(floatRect(x, y, right, y+outerSize)).(*ebiten.Image).Fill(outerColor)
target.SubImage(floatRect(x, bottom-outerSize, right, bottom)).(*ebiten.Image).Fill(outerColor)
target.SubImage(floatRect(x, y, x+outerSize, bottom)).(*ebiten.Image).Fill(outerColor)
target.SubImage(floatRect(right-outerSize, y, right, bottom)).(*ebiten.Image).Fill(outerColor)
innerColor := color.RGBA{255, 255, 255, 255}
innerPadding := 1 * world.CamScale
innerSize := 1 * world.CamScale
target.SubImage(floatRect(x+innerPadding, y+innerPadding, right-innerPadding, y+innerPadding+innerSize)).(*ebiten.Image).Fill(innerColor)
target.SubImage(floatRect(x+innerPadding, bottom-innerPadding-innerSize, right-innerPadding, bottom-innerPadding)).(*ebiten.Image).Fill(innerColor)
target.SubImage(floatRect(x+innerPadding, y+innerPadding, x+innerPadding+innerSize, bottom-innerPadding)).(*ebiten.Image).Fill(innerColor)
target.SubImage(floatRect(right-innerPadding-innerSize, y+innerPadding, right-innerPadding, bottom-innerPadding)).(*ebiten.Image).Fill(innerColor)
}