From d7ac12335975e908551a31834371937cf0e186d1 Mon Sep 17 00:00:00 2001 From: codegirl-007 Date: Mon, 8 Jun 2026 00:45:48 -0700 Subject: [PATCH] able to spawn enemy when pressing space --- game/app.odin | 2 +- game/constants.odin | 3 +++ game/enemy.odin | 18 ++++++++++++++++++ game/map.odin | 17 +++++++++++++++++ game/math2d.odin | 6 ++++++ game/path.odin | 16 ++++++++++++++++ game/render.odin | 25 +++++++++++++++++++++++++ game/world.odin | 20 ++++++++++++++------ 8 files changed, 100 insertions(+), 7 deletions(-) create mode 100644 game/enemy.odin create mode 100644 game/math2d.odin create mode 100644 game/path.odin create mode 100644 game/render.odin diff --git a/game/app.odin b/game/app.odin index d6ead4d..a822289 100644 --- a/game/app.odin +++ b/game/app.odin @@ -3,7 +3,7 @@ package game import rl "vendor:raylib" run :: proc() { - rl.InitWindow(640, 480, "Tower Defense") + rl.InitWindow(SCREEN_W, SCREEN_H, "Tower Defense") defer rl.CloseWindow() rl.SetTargetFPS(60) diff --git a/game/constants.odin b/game/constants.odin index d49f51a..54839b9 100644 --- a/game/constants.odin +++ b/game/constants.odin @@ -4,3 +4,6 @@ MAP_W :: 16 // map width in tiles MAP_H :: 12 // map height in tiles TILE_SIZE :: 32 // size of tiles in pixels +SCREEN_W :: MAP_W * TILE_SIZE +SCREEN_H :: MAP_H * TILE_SIZE + diff --git a/game/enemy.odin b/game/enemy.odin new file mode 100644 index 0000000..1e39316 --- /dev/null +++ b/game/enemy.odin @@ -0,0 +1,18 @@ +package game + +Enemy :: struct { + position: Vec2, + health: int, + active: bool, +} + +spawn_enemy :: proc(world: ^World) { + if len(world.path) == 0 do return // don't spawn enemies if no paths exist + + world.enemy = Enemy { + position = world.path[0], + health = 20, + active = true, + } +} + diff --git a/game/map.odin b/game/map.odin index 715df5e..4add8dc 100644 --- a/game/map.odin +++ b/game/map.odin @@ -30,5 +30,22 @@ init_map :: proc(world_map: ^Map) { world_map.tiles[y][x] = .Blocked } } + + for x in 1 ..< 13 { + world_map.tiles[6][x] = .Path + } + + for y in 7 ..< 8 { + world_map.tiles[y][12] = .Path + } + + for y in 4 ..< 9 { + for x in 3 ..< 12 { + if world_map.tiles[y][x] != .Path { + world_map.tiles[y][x] = .Build + } + } + } + } diff --git a/game/math2d.odin b/game/math2d.odin new file mode 100644 index 0000000..046d5a8 --- /dev/null +++ b/game/math2d.odin @@ -0,0 +1,6 @@ +package game + +Vec2 :: struct { + x, y: f32, +} + diff --git a/game/path.odin b/game/path.odin new file mode 100644 index 0000000..8ac4da5 --- /dev/null +++ b/game/path.odin @@ -0,0 +1,16 @@ +package game + +build_path :: proc(world_map: ^Map, path: ^[dynamic]Vec2) { + clear(path) + for y in 0 ..< MAP_H { + for x in 0 ..< MAP_W { + if world_map.tiles[y][x] == .Path { + append( + path, + Vec2{f32(x * TILE_SIZE + TILE_SIZE / 2), f32(y * TILE_SIZE + TILE_SIZE / 2)}, + ) + } + } + } +} + diff --git a/game/render.odin b/game/render.odin new file mode 100644 index 0000000..fe4ae12 --- /dev/null +++ b/game/render.odin @@ -0,0 +1,25 @@ +package game + +import "core:fmt" +import rl "vendor:raylib" + +render_world :: proc(world: ^World) { + for y in 0 ..< MAP_H { + for x in 0 ..< MAP_W { + c := tile_color(world.world_map.tiles[y][x]) + rl.DrawRectangle(i32(x * TILE_SIZE), i32(y * TILE_SIZE), TILE_SIZE, TILE_SIZE, c) + } + } + + for p in world.path { + rl.DrawCircle(i32(p.x), i32(p.y), 3, rl.GOLD) + } + + if world.enemy.active { + e := world.enemy + rl.DrawCircle(i32(e.position.x), i32(e.position.y), 11, rl.MAROON) + } + rl.DrawText(fmt.ctprintf("Gold: %d", world.gold), 10, 10, 20, rl.BLACK) // Gold HUD + rl.DrawText(fmt.ctprintf("Base HP: %d", world.base_health), 10, 32, 20, rl.BLACK) // HP HUD +} + diff --git a/game/world.odin b/game/world.odin index 74a4e19..3cbe3d1 100644 --- a/game/world.odin +++ b/game/world.odin @@ -5,10 +5,19 @@ import rl "vendor:raylib" World :: struct { gold: int, base_health: int, + world_map: Map, + path: [dynamic]Vec2, + enemy: Enemy, } init_world :: proc() -> World { - return World{gold = 10, base_health = 20} + world := World { + gold = 100, + base_health = 20, + } + init_map(&world.world_map) + build_path(&world.world_map, &world.path) + return world } // update world, never draw @@ -18,10 +27,9 @@ update_world :: proc(world: ^World, dt: f32) { if rl.IsKeyPressed(.G) { world.gold += 10 } -} - -render_world :: proc(world: ^World) { - rl.DrawText(fmt.caprintf("gold: %d", world.gold), 10, 10, 22, rl.BLACK) - rl.DrawText(fmt.caprintf("health: %d", world.base_health), 10, 38, 22, rl.BLACK) + + if rl.IsKeyPressed(.SPACE) { + spawn_enemy(world) + } }