package main import ( "bytes" "github.com/hajimehoshi/ebiten/v2" "github.com/hajimehoshi/ebiten/v2/audio" "gitlab.com/kbr4/9heroja/resources" "image" _ "image/png" "log" ) const ( screenWidth = 640 screenHeight = 480 tileSize = 33 titleFontSize = fontSize * 1.5 fontSize = 24 smallFontSize = fontSize / 2 pipeWidth = tileSize * 2 pipeStartOffsetX = 8 pipeIntervalX = 8 pipeGapY = 5 ) var ( heroImage *ebiten.Image grassImage *ebiten.Image ) func floorDiv(x, y int) int { d := x / y if d*y == x || x >= 0 { return d } return d - 1 } func floorMod(x, y int) int { return x - floorDiv(x, y)*y } type Game struct { // The gopher's position x16 int y16 int vy16 int // Camera cameraX int cameraY int // Pipes pipeTileYs []int gameoverCount int touchIDs []ebiten.TouchID gamepadIDs []ebiten.GamepadID audioContext *audio.Context jumpPlayer *audio.Player hitPlayer *audio.Player } func (g *Game) Update() error { return nil } func (g *Game) Draw(screen *ebiten.Image) { g.drawGrass(screen) g.drawHero(screen) } func (g *Game) Layout(outsideWidth, outsideHeight int) (screenWidth, screenHeight int) { s := ebiten.DeviceScaleFactor() return int(float64(outsideWidth) * s), int(float64(outsideHeight) * s) } func (g *Game) drawHero(screen *ebiten.Image) { const ( nx = screenWidth / tileSize ny = screenHeight / tileSize ) op := &ebiten.DrawImageOptions{} // ground op.GeoM.Reset() op.GeoM.Translate(screenWidth/2-16, 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+tileSize, 166+tileSize)).(*ebiten.Image), op) } func (g *Game) drawGrass(screen *ebiten.Image) { op := &ebiten.DrawImageOptions{} for i := 0; i <= screenWidth/64; i++ { for j := 0; j <= screenHeight/64; j++ { // ground op.GeoM.Reset() op.GeoM.Translate(float64(i*64), float64(j*64)) screen.DrawImage(grassImage.SubImage(image.Rect(32, 160, 32+64, 160+64)).(*ebiten.Image), op) } } } func init() { img, _, err := image.Decode(bytes.NewReader(resources.Hero_png)) if err != nil { log.Fatal(err) } heroImage = ebiten.NewImageFromImage(img) img, _, err = image.Decode(bytes.NewReader(resources.Grass_png)) if err != nil { log.Fatal(err) } grassImage = ebiten.NewImageFromImage(img) } func main() { ebiten.SetWindowSize(screenWidth, screenHeight) ebiten.SetWindowTitle("Bosanski Zombicid") if err := ebiten.RunGame(&Game{}); err != nil { log.Fatal(err) } }