Refactor character and enemy AI movement logic; implement delta time for smoother updates and replace object (a reserved keyword) with prop.

This commit is contained in:
2026-03-28 16:43:37 +00:00
parent 95f2be311d
commit e42b31ec24
13 changed files with 219 additions and 205 deletions
+15 -15
View File
@@ -1,6 +1,6 @@
class EnemyAI
AGGRO_RADIUS = 2000
SPEED = 2
SPEED = 120.0
CORNER_OFFSET = 35 # how far from tile center to place corner waypoint
def initialize(enemy, type)
@@ -12,7 +12,7 @@ class EnemyAI
@avoiding_obstacle = false
end
def update(player_x, player_y)
def update(player_x, player_y, dt)
distance = Gosu.distance(@enemy.x, @enemy.y, player_x, player_y)
return unless distance < AGGRO_RADIUS
@@ -21,14 +21,14 @@ class EnemyAI
return if $bus.get_all(:collides?, @enemy.rect)&.include?(:character)
object_in_tile = $bus.get(:object_at, enemy_tile[0], enemy_tile[1])
prop_in_tile = $bus.get(:prop_at, enemy_tile[0], enemy_tile[1])
if player_tile == enemy_tile
los_blocked = !object_in_tile.nil? && !(
line_of_sight?(@enemy.x - @enemy.w / 2, @enemy.y - @enemy.h / 2, player_x, player_y, object_in_tile.rect) &&
line_of_sight?(@enemy.x + @enemy.w / 2, @enemy.y + @enemy.h / 2, player_x, player_y, object_in_tile.rect) &&
line_of_sight?(@enemy.x - @enemy.w / 2, @enemy.y + @enemy.h / 2, player_x, player_y, object_in_tile.rect) &&
line_of_sight?(@enemy.x + @enemy.w / 2, @enemy.y - @enemy.h / 2, player_x, player_y, object_in_tile.rect)
los_blocked = !prop_in_tile.nil? && !(
line_of_sight?(@enemy.x - @enemy.w / 2, @enemy.y - @enemy.h / 2, player_x, player_y, prop_in_tile.rect) &&
line_of_sight?(@enemy.x + @enemy.w / 2, @enemy.y + @enemy.h / 2, player_x, player_y, prop_in_tile.rect) &&
line_of_sight?(@enemy.x - @enemy.w / 2, @enemy.y + @enemy.h / 2, player_x, player_y, prop_in_tile.rect) &&
line_of_sight?(@enemy.x + @enemy.w / 2, @enemy.y - @enemy.h / 2, player_x, player_y, prop_in_tile.rect)
)
if los_blocked
@@ -48,7 +48,7 @@ class EnemyAI
@avoiding_obstacle = true
end
else
move_towards(player_x, player_y)
move_towards(player_x, player_y, dt)
return
end
end
@@ -56,7 +56,7 @@ class EnemyAI
if @waypoints.empty? || @last_player_tile != player_tile
@last_player_tile = player_tile
@tile_path = $bus.get(:maze_solve, enemy_tile[0], enemy_tile[1], player_tile[0], player_tile[1]) || []
if $bus.get(:object_at, enemy_tile[0], enemy_tile[1]).nil?
if $bus.get(:prop_at, enemy_tile[0], enemy_tile[1]).nil?
@tile_path.shift
end
@waypoints = build_waypoints(@tile_path)
@@ -72,7 +72,7 @@ class EnemyAI
return
end
move_towards(target_x, target_y)
move_towards(target_x, target_y, dt)
end
def draw
@@ -92,7 +92,7 @@ class EnemyAI
center_x = tx * 120 + 90
center_y = ty * 120 + 90
unless $bus.get(:object_at, tx, ty).nil?
unless $bus.get(:prop_at, tx, ty).nil?
next_tile = tile_path[i + 1]
prev_tile = i > 0 ? tile_path[i - 1] : nil
@@ -126,10 +126,10 @@ class EnemyAI
waypoints
end
def move_towards(target_x, target_y)
def move_towards(target_x, target_y, dt)
angle = Gosu.angle(@enemy.x, @enemy.y, target_x, target_y)
dx = Gosu.offset_x(angle, SPEED)
dy = Gosu.offset_y(angle, SPEED)
dx = Gosu.offset_x(angle, SPEED * dt)
dy = Gosu.offset_y(angle, SPEED * dt)
@enemy.x += dx
@enemy.y += dy