package main import ( "bytes" _ "embed" "image" _ "image/png" "github.com/hajimehoshi/ebiten/v2" ) const ( REWARD_HEIGHT = 32 REWARD_WIDTH = 32 REWARD_FX_CYCLES = 9 //number of animation cycles for effects REWARD_FX_SHEEN_IDX = 11 //row offset from png, sheen effect REWARD_FX_SPRKL_IDX = 7 //row offset from png, sparkle effect ) var ( //go:embed resources/images/gold.png assetsReward_png []byte rewardsImage *ebiten.Image //go:embed resources/images/shiny.png assetsShiny_png []byte shinyImage *ebiten.Image ) type Reward struct { Sprite *ebiten.Image scratch *ebiten.Image cycle int } func NewReward() *Reward { r := &Reward{ cycle: 0, } r.Sprite = ebiten.NewImageFromImage(rewardsImage) r.scratch = ebiten.NewImageFromImage(rewardsImage) return r } func (r *Reward) Animate() { r.scratch.Clear() r.Sprite.Clear() r.scratch.DrawImage(rewardsImage.SubImage(image.Rect(0, 0, REWARD_WIDTH, REWARD_HEIGHT)).(*ebiten.Image), nil) //animate the effects if r.cycle < REWARD_FX_CYCLES { //add sheen op := &ebiten.DrawImageOptions{} op.Blend = ebiten.BlendSourceAtop sx := r.cycle * REWARD_WIDTH sy := REWARD_HEIGHT * REWARD_FX_SHEEN_IDX ex := sx + REWARD_WIDTH ey := sy + REWARD_HEIGHT r.scratch.DrawImage(shinyImage.SubImage(image.Rect(sx, sy, ex, ey)).(*ebiten.Image), op) //add sparkle: x postions are identical to sheen (same png sheet), just need to compute new y offsets spsy := REWARD_HEIGHT * REWARD_FX_SPRKL_IDX spey := spsy + REWARD_HEIGHT op.GeoM.Translate(REWARD_WIDTH/2, REWARD_HEIGHT/2) r.scratch.DrawImage(shinyImage.SubImage(image.Rect(sx, spsy, ex, spey)).(*ebiten.Image), nil) } r.Sprite.DrawImage(r.scratch, nil) r.CycleUpdate() } func (r *Reward) CycleUpdate() { r.cycle = (r.cycle + 1) % (REWARD_FX_CYCLES * 8) } func (r *Reward) Width() int { return REWARD_WIDTH } func (r *Reward) Height() int { return REWARD_HEIGHT } func init() { img, _, err := image.Decode(bytes.NewReader(assetsReward_png)) if err != nil { DashLogger.Fatal(err) } rewardsImage = ebiten.NewImageFromImage(img) img, _, err = image.Decode(bytes.NewReader(assetsShiny_png)) if err != nil { DashLogger.Fatal(err) } shinyImage = ebiten.NewImageFromImage(img) }