Files
pobounty/reward.go

105 lines
2.2 KiB
Go
Raw Permalink Normal View History

2023-09-17 13:34:03 -04:00
package main
import (
"bytes"
_ "embed"
"image"
_ "image/png"
"github.com/hajimehoshi/ebiten/v2"
)
const (
REWARD_HEIGHT = 32
REWARD_WIDTH = 32
2023-10-02 14:38:49 -04:00
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
2023-09-17 13:34:03 -04:00
)
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)
2023-10-02 14:38:49 -04:00
//animate the effects
if r.cycle < REWARD_FX_CYCLES {
2023-09-17 13:34:03 -04:00
//add sheen
op := &ebiten.DrawImageOptions{}
op.Blend = ebiten.BlendSourceAtop
sx := r.cycle * REWARD_WIDTH
2023-10-02 14:38:49 -04:00
sy := REWARD_HEIGHT * REWARD_FX_SHEEN_IDX
2023-09-17 13:34:03 -04:00
ex := sx + REWARD_WIDTH
ey := sy + REWARD_HEIGHT
r.scratch.DrawImage(shinyImage.SubImage(image.Rect(sx, sy, ex, ey)).(*ebiten.Image), op)
2023-10-02 14:38:49 -04:00
//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
2023-09-17 13:34:03 -04:00
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() {
2023-10-02 14:38:49 -04:00
r.cycle = (r.cycle + 1) % (REWARD_FX_CYCLES * 8)
2023-09-17 13:34:03 -04:00
}
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 {
2023-10-02 14:38:49 -04:00
DashLogger.Fatal(err)
2023-09-17 13:34:03 -04:00
}
rewardsImage = ebiten.NewImageFromImage(img)
img, _, err = image.Decode(bytes.NewReader(assetsShiny_png))
if err != nil {
2023-10-02 14:38:49 -04:00
DashLogger.Fatal(err)
2023-09-17 13:34:03 -04:00
}
shinyImage = ebiten.NewImageFromImage(img)
}