Starting to add in assets.
This commit is contained in:
106
client/elements/dino.go
Normal file
106
client/elements/dino.go
Normal file
@@ -0,0 +1,106 @@
|
||||
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
|
||||
}
|
||||
Reference in New Issue
Block a user