Files
2024-12-14 11:32:41 -05:00

107 lines
2.0 KiB
Go

package elements
import (
"client/assets"
"client/gamedata"
"image"
"github.com/hajimehoshi/ebiten/v2"
)
const (
dinoWidth = 24
dinoHeight = 24
)
type DinoInfo struct {
DinoAction gamedata.DinoAction
NumCycles int
XOffset int
}
var (
dinoCycleCount = []DinoInfo{
{gamedata.DinoActionIdle, 4, 0},
{gamedata.DinoActionWalk, 6, 4},
{gamedata.DinoActionSlap, 3, 10},
}
)
type Dino struct {
Sprite *ebiten.Image
dinotype gamedata.DinoType
dinoaction gamedata.DinoAction
cycle int
asset *ebiten.Image
left bool
slapping bool
}
func NewDino(dtype gamedata.DinoType) *Dino {
dino := &Dino{
Sprite: ebiten.NewImage(dinoWidth*2, dinoHeight*2),
cycle: 0,
dinotype: dtype,
dinoaction: gamedata.DinoActionIdle,
}
switch dtype {
case gamedata.DinoTypeBlue:
dino.asset = assets.ImageBank[assets.Blue]
case gamedata.DinoTypeGreen:
dino.asset = assets.ImageBank[assets.Green]
case gamedata.DinoTypeRed:
dino.asset = assets.ImageBank[assets.Red]
case gamedata.DinoTypeYellow:
dino.asset = assets.ImageBank[assets.Yellow]
}
return dino
}
func (d *Dino) Update() {
d.cycle++
}
func (d *Dino) Draw() {
d.Sprite.Clear()
idx := d.cycle / 8 % dinoCycleCount[d.dinoaction].NumCycles
x0 := dinoWidth * (idx + dinoCycleCount[d.dinoaction].XOffset)
y0 := 0
x1 := x0 + dinoWidth
y1 := dinoHeight
op := &ebiten.DrawImageOptions{}
if d.left {
op.GeoM.Scale(-1, 1)
op.GeoM.Translate(dinoWidth, 0)
}
op.GeoM.Translate(-dinoWidth/2, -dinoHeight/2)
op.GeoM.Scale(2, 2)
op.GeoM.Translate(dinoWidth, dinoHeight)
d.Sprite.DrawImage(d.asset.SubImage(image.Rect(x0, y0, x1, y1)).(*ebiten.Image), op)
if d.slapping && idx >= dinoCycleCount[d.dinoaction].NumCycles-1 {
d.slapping = false
}
}
func (d *Dino) SetAction(action gamedata.DinoAction) {
if d.slapping {
//wait until we're done slapping
} else {
d.dinoaction = action
if action == gamedata.DinoActionSlap {
d.cycle = 0
d.slapping = true
}
}
}
func (d *Dino) SetLeft(left bool) {
d.left = left
}