package hud import ( "fmt" "github.com/chompy/roguelike_rpg/internal/client/gfx" "github.com/hajimehoshi/ebiten/v2" "github.com/hajimehoshi/ebiten/v2/text/v2" ) const ( damageTextYOffset = 12 ) type DamageText struct { BaseElement Image *ebiten.Image Start float32 Active bool font *gfx.Font } func NewDamageText(gfx *gfx.Context, damage int) (*DamageText, error) { font, err := gfx.FontLibrary.GetOne("damage") if err != nil { return nil, err } op := &text.DrawOptions{} if damage < 0 { damage = -1 * damage op.ColorScale.Scale(0, 1, 0, 1) } damageText := fmt.Sprintf("%d", damage) w, h := text.Measure(damageText, font.Font, 0) image := ebiten.NewImage(int(w), int(h)) text.Draw(image, damageText, font.Font, op) return &DamageText{ Image: image, Start: GetTime(), Active: true, font: font, }, nil } func (d *DamageText) Draw(time float32, screen *ebiten.Image) (bool, error) { op := &ebiten.DrawImageOptions{} op.GeoM.Translate(float64(d.X), float64(d.Y+damageTextYOffset)) isPlaying, err := d.font.ApplyEffects(time-d.Start, op) if err != nil { return false, err } screen.DrawImage(d.Image, op) return isPlaying, nil }