From b4e1f459bfb64818e0a09b80b9315a1ffc9948a8 Mon Sep 17 00:00:00 2001 From: iegod Date: Wed, 6 Nov 2024 19:51:28 -0500 Subject: [PATCH] Added randomly generated background. --- game.go | 49 +++++++++++++++++++++++++++++++++++++++++++++++++ grasstile.png | Bin 0 -> 11491 bytes main.go | 2 +- 3 files changed, 50 insertions(+), 1 deletion(-) create mode 100644 grasstile.png diff --git a/game.go b/game.go index 3f70137..9909ce2 100644 --- a/game.go +++ b/game.go @@ -1,13 +1,17 @@ package main import ( + "bytes" "fmt" + "image" "image/color" "log" "math" "math/rand/v2" "mover/fonts" + _ "embed" + "github.com/hajimehoshi/ebiten/v2" "github.com/hajimehoshi/ebiten/v2/inpututil" "github.com/hajimehoshi/ebiten/v2/text" @@ -19,7 +23,15 @@ const ( MOVER_HEIGHT = 48 ) +var ( + tilesetImage *ebiten.Image + + //go:embed grasstile.png + tileset_img []byte +) + type Game struct { + background *ebiten.Image collisionMask *ebiten.Image projectileMask *ebiten.Image heroCollisionMask *ebiten.Image @@ -46,10 +58,19 @@ type Game struct { //pressedButtons map[ebiten.GamepadID][]string } +func init() { + img, _, err := image.Decode(bytes.NewReader(tileset_img)) + if err != nil { + log.Fatal(err) + } + tilesetImage = ebiten.NewImageFromImage(img) +} + func (g *Game) Initialize() { origin := Coordinates{X: 640 / 2, Y: 480 / 2} + g.ConstructBackground() g.hero = NewHero() g.hero.SetOrigin(origin) g.hero.ToggleRotate() @@ -113,6 +134,9 @@ func (g *Game) Update() error { func (g *Game) Draw(screen *ebiten.Image) { + screen.Clear() + screen.DrawImage(g.background, nil) + g.hero.Draw() op := &ebiten.DrawImageOptions{} @@ -269,6 +293,8 @@ func (g *Game) UpdateProjectiles() { if p.Pos.X >= target.Pos.X-MOVER_WIDTH/2 && p.Pos.X <= target.Pos.X+MOVER_WIDTH/2 && p.Pos.Y >= target.Pos.Y-MOVER_HEIGHT/2 && p.Pos.Y <= target.Pos.Y+MOVER_HEIGHT/2 && target.Action == MoverActionDamaged { //fmt.Println("potential collision") + //the following computes total collisions in the image using a projectile mask that is a duplicate of what is on screen + //there's definitely room for optimization here g.collisionMask.Clear() g.collisionMask.DrawImage(g.projectileMask, nil) @@ -398,3 +424,26 @@ func (g *Game) UpdateHeroPosition() { g.hero.Pos.Y += ebiten.GamepadAxisValue(0, 1) * 5 } } + +func (g *Game) ConstructBackground() { + g.background = ebiten.NewImage(screenWidth, screenHeight) + + for i := 0; i < 640/16; i++ { + for j := 0; j < 480/16; j++ { + + //select random tile in x and y from tileset + idx_x := rand.IntN(256 / 16) + idx_y := rand.IntN(256 / 16) + + x0 := 16 * idx_x + y0 := 16 * idx_y + x1 := x0 + 16 + y1 := y0 + 16 + + //translate for grid element we're painting + op := &ebiten.DrawImageOptions{} + op.GeoM.Translate(float64(i)*16, float64(j)*16) + g.background.DrawImage(tilesetImage.SubImage(image.Rect(x0, y0, x1, y1)).(*ebiten.Image), op) + } + } +} diff --git a/grasstile.png b/grasstile.png new file mode 100644 index 0000000000000000000000000000000000000000..7299ad887dc04692e4693242a321e68ab8f5cc89 GIT binary patch literal 11491 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 literal 0 HcmV?d00001 diff --git a/main.go b/main.go index eac11e0..30a9115 100644 --- a/main.go +++ b/main.go @@ -13,7 +13,7 @@ const ( ) func main() { - ver := "survive v0.06" + ver := "survive v0.08" fmt.Println(ver)