From c94c6ed682f72296f8c1de07eed52db6756d4aa5 Mon Sep 17 00:00:00 2001 From: jxnshi Date: Wed, 12 Mar 2025 14:42:51 +0100 Subject: [PATCH] Changed slice for bounded array --- assets/assets.go | 3 ++ assets/player.png | Bin 4187 -> 1575 bytes assets/tiles.png | Bin 0 -> 1389 bytes bounded_array.go | 33 +++++++++++++++++++ main.go | 70 ++++++++++++++++++++++++++-------------- tile.go | 33 +++++++++++++++++++ tools/tile-edit/go.mod | 3 ++ tools/tile-edit/main.go | 28 ++++++++++++++++ 8 files changed, 146 insertions(+), 24 deletions(-) create mode 100644 assets/tiles.png create mode 100644 bounded_array.go create mode 100644 tile.go create mode 100644 tools/tile-edit/go.mod create mode 100644 tools/tile-edit/main.go diff --git a/assets/assets.go b/assets/assets.go index 66ad5a2..0c7fb7f 100644 --- a/assets/assets.go +++ b/assets/assets.go @@ -4,3 +4,6 @@ import _ "embed" //go:embed player.png var Player []byte + +//go:embed tiles.png +var Tiles []byte diff --git a/assets/player.png b/assets/player.png index 518a87a2b5a606602b32be439e98ae3af7690a68..7a4c9703035374129b22fff118ecaf13c7ea804e 100644 GIT binary patch literal 1575 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 ATL1t6 diff --git a/assets/tiles.png b/assets/tiles.png new file mode 100644 index 0000000000000000000000000000000000000000..187ba38bbd9c1ee241d6a38db6778914ea0afa57 GIT binary patch literal 1389 zcmeAS@N?(olHy`uVBq!ia0y~yU;;9k7&zE~)R&4Yzkn2Dage(c!@6@aFBuqE)jeGt zLn`LHy}L2+u!8{W1?x5;kB*E6sf>m>Vi}!c8VzhK8reGLTxjN$FqZ0lBbgGpJLx|6 zTj`gZen-vyR>l48&#wFK_x?ZC{Pb?^*L&4(cotAnq2kLRF*|BQ zzwWghE0Kt5f`pJs()3^(6NZA zfbp<;UAH}hBqsy+EUmBF|CuLD3};{nxR9pBu#1`LKv58T!7ufd9u3F2Y}Mg|5hA)u+FU^E0q fLtyBIKtuffORuxKCuw}?13BK))z4*}Q$iB}#h|1a literal 0 HcmV?d00001 diff --git a/bounded_array.go b/bounded_array.go new file mode 100644 index 0000000..6fb4ae4 --- /dev/null +++ b/bounded_array.go @@ -0,0 +1,33 @@ +package main + +import "errors" + +const BoundedArrayLen int = 100 + +type BoundedArrayError struct { + Err error +} + +func (err *BoundedArrayError) Error() string { + return err.Err.Error() +} + +type BoundedArray[T any] struct { + Data [BoundedArrayLen]T + Len int +} + +func (array *BoundedArray[T]) Append(elem T) error { + if array.Len >= BoundedArrayLen { + return errors.New("Bounded array full.") + } + + array.Data[array.Len] = elem + array.Len += 1 + + return nil +} + +func (array *BoundedArray[T]) GetData() []T { + return array.Data[:array.Len] +} diff --git a/main.go b/main.go index f6fb20b..a79016c 100644 --- a/main.go +++ b/main.go @@ -6,64 +6,70 @@ import ( "they-gone/assets" ) -const mapSize = 100 - -type Tile uint8 +const mapSize int = 100 type App struct { Camera rl.Camera2D - Entities []Entity -} - -func moveVector() rl.Vector2 { - var vector rl.Vector2 - - if rl.IsKeyDown(rl.KeyA) { vector.X -= 1 } - if rl.IsKeyDown(rl.KeyD) { vector.X += 1 } - - if rl.IsKeyDown(rl.KeyW) { vector.Y -= 1 } - if rl.IsKeyDown(rl.KeyS) { vector.Y += 1 } + Entities BoundedArray[Entity] - return vector + BackgroundTiles [mapSize * mapSize]Tile + MiddlegroundTiles [mapSize * mapSize]Tile + ForegroundTiles [mapSize * mapSize]Tile } func main() { const windowWidth int = 800 const windowHeight int = 600 - const playerSpeed float32 = 3 + const playerSpeed float32 = 5 - rl.InitWindow(int32(windowWidth), int32(windowHeight), "They left.") + rl.InitWindow(int32(windowWidth), int32(windowHeight), "They gone.") defer rl.CloseWindow() rl.SetTargetFPS(30) playerImage := rl.LoadImageFromMemory(".png", assets.Player, int32(len(assets.Player))) + tilesImage := rl.LoadImageFromMemory(".png", assets.Tiles, int32(len(assets.Tiles))) playerTexture := rl.LoadTextureFromImage(playerImage) defer rl.UnloadTexture(playerTexture) + tilesTexture := rl.LoadTextureFromImage(tilesImage) + defer rl.UnloadTexture(tilesTexture) + rl.UnloadImage(playerImage) + rl.UnloadImage(tilesImage) - playerSize := rl.Vector2{ 300, 300 } + playerSize := rl.Vector2{ 48, 104 } app := App{ Camera: rl.Camera2D{ - Offset: rl.Vector2{ float32(windowWidth) / 2, float32(windowHeight) - playerSize.Y / 2 }, + Offset: rl.Vector2{ float32(windowWidth) / 2, (float32(windowHeight) + playerSize.Y) / 2 }, Zoom: 1, }, - Entities: make([]Entity, 0), + } + + for i := 0; i < mapSize * mapSize; i += 1 { + app.BackgroundTiles[i] = 1 } { player := NewEntity(playerTexture, rl.Vector2{}, playerSize) - app.Entities = append(app.Entities, player) + _ = app.Entities.Append(player) } - player := &app.Entities[0] + player := &app.Entities.GetData()[0] for !rl.WindowShouldClose() { - moveVec := moveVector() + var moveVec rl.Vector2 + + if rl.IsKeyDown(rl.KeyA) { moveVec.X -= 1 } + if rl.IsKeyDown(rl.KeyD) { moveVec.X += 1 } + + if rl.IsKeyDown(rl.KeyW) { moveVec.Y -= 1 } + if rl.IsKeyDown(rl.KeyS) { moveVec.Y += 1 } + + moveVec = rl.Vector2Normalize(moveVec) if moveVec.X > 0 { player.Flip = false } if moveVec.X < 0 { player.Flip = true } @@ -71,6 +77,11 @@ func main() { player.Position.X += playerSpeed * moveVec.X player.Position.Y += playerSpeed * moveVec.Y + app.Camera.Target = player.Position + + // TODO: Remove before release + app.Camera.Zoom += rl.GetMouseWheelMove() * 0.1 + rl.BeginDrawing() rl.ClearBackground(rl.Black) @@ -78,7 +89,18 @@ func main() { { rl.BeginMode2D(app.Camera) - for _, entity := range app.Entities { + for i := 0; i < mapSize * mapSize; i += 1 { + x := i % mapSize + y := int(i / mapSize) + + backgroundTile := app.BackgroundTiles[i] + middlegroundTile:= app.MiddlegroundTiles[i] + + DrawTile(tilesTexture, backgroundTile, x, y) + DrawTile(tilesTexture, middlegroundTile, x, y) + } + + for _, entity := range app.Entities.GetData() { DrawEntity(entity) } diff --git a/tile.go b/tile.go new file mode 100644 index 0000000..1240567 --- /dev/null +++ b/tile.go @@ -0,0 +1,33 @@ +package main + +import rl "github.com/gen2brain/raylib-go/raylib" + +type Tile uint8 + +const TileSize int = 32 + +func DrawTile(tileMap rl.Texture2D, tile Tile, x int, y int) { + tileMapSize := int(tileMap.Width) / TileSize + scale := 2 + + srcRect := rl.Rectangle{ + X: float32(int(tile) % tileMapSize * TileSize), + Y: float32(int(tile) / tileMapSize * TileSize), + Width: float32(TileSize), + Height: float32(TileSize), + } + + dstRect := rl.Rectangle{ + X: float32(x * TileSize * scale), + Y: float32(y * TileSize * scale), + Width: float32(TileSize * scale), + Height: float32(TileSize * scale), + } + + origin := rl.Vector2{ + X: float32(TileSize / 2), + Y: float32(TileSize / 2), + } + + rl.DrawTexturePro(tileMap, srcRect, dstRect, origin, 0, rl.RayWhite) +} diff --git a/tools/tile-edit/go.mod b/tools/tile-edit/go.mod new file mode 100644 index 0000000..64f7e42 --- /dev/null +++ b/tools/tile-edit/go.mod @@ -0,0 +1,3 @@ +module tile-edit + +go 1.24.0 diff --git a/tools/tile-edit/main.go b/tools/tile-edit/main.go new file mode 100644 index 0000000..ea65f2f --- /dev/null +++ b/tools/tile-edit/main.go @@ -0,0 +1,28 @@ +package main + +import rl "github.com/gen2brain/raylib-go/raylib" + +func main() { + rl.InitWindow(800, 600, "Tile Edit") + defer rl.CloseWindow() + + rl.SetTargetFPS(60) + + camera := rl.Camera2D{ + Zoom: 1, + } + + for !rl.WindowShouldClose() { + rl.BeginDrawing() + + rl.ClearBackground(rl.Black) + + { + rl.BeginMode2D(camera) + + rl.EndMode2D() + } + + rl.EndDrawing() + } +} -- 2.49.0