Files
pobounty/reward.go
2023-09-17 13:34:03 -04:00

105 lines
2.0 KiB
Go

package main
import (
"bytes"
_ "embed"
"image"
_ "image/png"
"log"
"github.com/hajimehoshi/ebiten/v2"
)
const (
REWARD_HEIGHT = 32
REWARD_WIDTH = 32
SHINY_ANIMATION_CYCLES = 9
SHINY_ROW_INDEX = 11
SPARKLE_ROW_INDEX = 7
)
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)
if r.cycle < SHINY_ANIMATION_CYCLES {
//add sheen
op := &ebiten.DrawImageOptions{}
op.Blend = ebiten.BlendSourceAtop
sx := r.cycle * REWARD_WIDTH
sy := REWARD_HEIGHT * SHINY_ROW_INDEX
ex := sx + REWARD_WIDTH
ey := sy + REWARD_HEIGHT
r.scratch.DrawImage(shinyImage.SubImage(image.Rect(sx, sy, ex, ey)).(*ebiten.Image), op)
//add sparkle
spsy := REWARD_HEIGHT * SPARKLE_ROW_INDEX
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) % (SHINY_ANIMATION_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 {
log.Fatal(err)
}
rewardsImage = ebiten.NewImageFromImage(img)
img, _, err = image.Decode(bytes.NewReader(assetsShiny_png))
if err != nil {
log.Fatal(err)
}
shinyImage = ebiten.NewImageFromImage(img)
}