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 }