105 lines
2.0 KiB
Go
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)
|
||
|
|
|
||
|
|
}
|