diff --git a/hero/hero.go b/hero/hero.go index ff35321..f0b2cb5 100644 --- a/hero/hero.go +++ b/hero/hero.go @@ -6,16 +6,39 @@ import ( "gitlab.com/kbr4/9heroja/resources" "image" "log" + "time" ) +const WalkSpeedMs = 400 + var ( - heroImage *ebiten.Image + 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 @@ -25,7 +48,8 @@ func (h *Hero) DrawHero(screen *ebiten.Image) { 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(67, 167, 66+resources.HeroTileSize, 166+resources.HeroTileSize)).(*ebiten.Image), op) + + screen.DrawImage(heroImage.SubImage(image.Rect(p.x+1, p.y, p.x+resources.HeroTileSize, p.y+resources.HeroTileSize)).(*ebiten.Image), op) } func init() { @@ -34,4 +58,37 @@ func init() { 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() } diff --git a/main.go b/main.go index 3f86583..9e0b8b5 100644 --- a/main.go +++ b/main.go @@ -45,6 +45,7 @@ type Game struct { } func (g *Game) Update() error { + g.terrain.GoDown() return nil } @@ -63,8 +64,9 @@ var GameInstance *Game func init() { GameInstance = &Game{} - GameInstance.hero = &hero.Hero{} - GameInstance.terrain = &terrain.Terrain{} + GameInstance.hero = hero.NewHero() + GameInstance.terrain = terrain.NewTerrain() + GameInstance.hero.Walk() } func main() { diff --git a/resources/hero.png b/resources/hero.png index 67e12b8..2237754 100644 Binary files a/resources/hero.png and b/resources/hero.png differ diff --git a/terrain/terrain.go b/terrain/terrain.go index 077acbf..6c1c74c 100644 --- a/terrain/terrain.go +++ b/terrain/terrain.go @@ -13,17 +13,21 @@ var ( ) type Terrain struct { + positionX float64 + positionY float64 } func (t *Terrain) DrawTerrain(screen *ebiten.Image) { screenWidth := screen.Bounds().Max.X screenHeight := screen.Bounds().Max.Y + offsetX := int(t.positionX) % 64 + offsetY := int(t.positionY) % 64 op := &ebiten.DrawImageOptions{} - for i := 0; i <= screenWidth/64; i++ { - for j := 0; j <= screenHeight/64; j++ { + for i := -1; i <= screenWidth/64+1; i++ { + for j := -1; j <= screenHeight/64+1; j++ { // ground op.GeoM.Reset() - op.GeoM.Translate(float64(i*64), float64(j*64)) + op.GeoM.Translate(float64(i*64+offsetX), float64(j*64+offsetY)) screen.DrawImage(grassImage.SubImage(image.Rect(32, 160, 32+64, 160+64)).(*ebiten.Image), op) } @@ -37,3 +41,14 @@ func init() { } grassImage = ebiten.NewImageFromImage(img) } + +func NewTerrain() *Terrain { + return &Terrain{ + positionX: 0, + positionY: 0, + } +} + +func (t *Terrain) GoDown() { + t.positionY += 1 +}