package hero import ( "bytes" "github.com/hajimehoshi/ebiten/v2" "gitlab.com/kbr4/9heroja/resources" "image" "log" "time" ) const WalkSpeedMs = 400 var ( heroImage *ebiten.Image walkTicker *time.Ticker ) type Hero struct { step int } type spritePosition struct { x int y int } func (h *Hero) DrawHero(screen *ebiten.Image) { positions := []spritePosition{ {0, 166}, {33, 166}, {66, 166}, {99, 166}, {132, 166}, {99, 166}, {66, 166}, {33, 166}, } p := positions[h.step%5] op := &ebiten.DrawImageOptions{} screenWidth := screen.Bounds().Max.X screenHeight := screen.Bounds().Max.Y // ground op.GeoM.Reset() op.GeoM.Translate(float64(screenWidth/2-16), float64(screenHeight/2-16)) //op.GeoM.Translate(float64(i*tileSize-floorMod(g.cameraX, tileSize)), // float64((ny-1)*tileSize-floorMod(g.cameraY, tileSize))) screen.DrawImage(heroImage.SubImage(image.Rect(p.x+1, p.y, p.x+resources.HeroTileSize, p.y+resources.HeroTileSize)).(*ebiten.Image), op) } func init() { img, _, err := image.Decode(bytes.NewReader(resources.Hero_png)) if err != nil { log.Fatal(err) } heroImage = ebiten.NewImageFromImage(img) walkTicker = time.NewTicker(WalkSpeedMs * time.Millisecond) // go routine that runs on every tick and increases step } func NewHero() *Hero { hero := &Hero{ step: 0, } go func() { for { select { case <-walkTicker.C: hero.step++ if hero.step > 7 { hero.step = 0 } } } }() return hero } func (h *Hero) Walk() { walkTicker.Reset(WalkSpeedMs * time.Millisecond) } func (h *Hero) Stop() { h.step = 2 walkTicker.Stop() }