From beec7c23cdd1e302093acf38001f5c29fb1c1b70 Mon Sep 17 00:00:00 2001 From: Jason Hilder Date: Mon, 3 Aug 2026 06:40:17 +0200 Subject: [PATCH] Setup basic enemy information and make enemy use flow field. --- src/enemy.odin | 59 ++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 4 deletions(-) diff --git a/src/enemy.odin b/src/enemy.odin index 9a62357..1d6f318 100644 --- a/src/enemy.odin +++ b/src/enemy.odin @@ -16,7 +16,9 @@ Enemy :: struct { // movement velocity: rl.Vector2, - speed: f32, + speed: f32, // max move speed + accel: f32, // how fast to reach speed + friction: f32, // how fast to stop // collision collider_offset: rl.Vector2, @@ -27,10 +29,14 @@ Enemy :: struct { enemy_init :: proc(assets: ^Enemy_Assets, pos: [2]f32) -> Enemy { enemy := Enemy{} enemy.position = {pos.x, pos.y} + enemy.speed = 100 + enemy.accel = 720 + enemy.friction = 640 + enemy.state = .IDLE enemy.collider_offset = rl.Vector2{8, 15} - enemy.collider_w = 16 - enemy.collider_h = 10 + enemy.collider_w = 12 + enemy.collider_h = 8 animation_play(&enemy.animation, &assets.clips[.IDLE]) return enemy @@ -45,6 +51,13 @@ get_enemy_collider :: proc(enemy: Enemy, pos: rl.Vector2) -> rl.Rectangle { } } +get_enemy_center :: proc(enemy: Enemy, pos: rl.Vector2) -> rl.Vector2 { + collider := get_enemy_collider(enemy, pos) + return rl.Vector2{ + collider.x + collider.width * 0.5, + collider.y + collider.height * 0.5, + } +} get_spawn_rect :: proc(max_x, max_y: f32) -> rl.Rectangle { enemy_spawn_points: [4]rl.Rectangle = { @@ -63,6 +76,7 @@ get_spawn_rect :: proc(max_x, max_y: f32) -> rl.Rectangle { return rand_pos } + // @TODO consider a self check, ie pass the enemy in question index and make sure to skip that spawn_enemy :: proc(enemy_array: ^[MAX_ENEMIES]Enemy, assets: ^Enemy_Assets, enemy_count: ^int, game_map: Game_Map) { max_x := game_map.width_px @@ -91,10 +105,47 @@ spawn_enemy :: proc(enemy_array: ^[MAX_ENEMIES]Enemy, assets: ^Enemy_Assets, ene } } -update_enemies :: proc(enemy_array: ^[MAX_ENEMIES]Enemy, assets: ^Enemy_Assets, enemy_cnt: int, dt: f32) { +update_enemies :: proc(enemy_array: ^[MAX_ENEMIES]Enemy, assets: ^Enemy_Assets, enemy_cnt: int, game_map: Game_Map, dt: f32) { for idx in 0..