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