61 lines
2.1 KiB
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)
|
|
}
|