From 7dc5746f4a3965dd8bd73fc1c458f80e8bd78787 Mon Sep 17 00:00:00 2001 From: Jason Hilder Date: Tue, 21 Jul 2026 06:22:43 +0200 Subject: [PATCH] Clamped camera to be bounded by map dims --- src/camera.odin | 28 ++++++++++++++++++++++++---- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/camera.odin b/src/camera.odin index 3b2d01e..b1e2fd4 100644 --- a/src/camera.odin +++ b/src/camera.odin @@ -1,5 +1,6 @@ package game +import "core:math/linalg" import rl "vendor:raylib" camera_init :: proc(player: ^Player, camera_zoom: f32) -> rl.Camera2D { @@ -13,9 +14,28 @@ camera_init :: proc(player: ^Player, camera_zoom: f32) -> rl.Camera2D { } } -update_camera :: proc(player: ^Player, camera: ^rl.Camera2D) { +update_camera :: proc(player: ^Player, camera: ^rl.Camera2D, map_width: f32, map_height: f32) { player_pos := get_player_center(player) - // camera.target = linalg.lerp(camera.target, player_pos, 0.18) - camera_target := get_player_center(player) - camera.target = camera_target + new_camera_target := get_player_center(player) + + visible_w := f32(GAME_WIDTH) / camera.zoom + visible_h := f32(GAME_HEIGHT) / camera.zoom + + half_w := visible_w * 0.5 + half_h := visible_h * 0.5 + + if visible_w >= map_width { + new_camera_target.x = map_width * 0.5; + } else { + new_camera_target.x = clamp(new_camera_target.x, half_w, map_width - half_w) + } + + if visible_h >= map_height { + new_camera_target.y = map_height * 0.5 + } else { + new_camera_target.y = clamp(new_camera_target.y, half_h, map_height - half_h) + } + + // Current target to new derived position + camera.target = linalg.lerp(camera.target, new_camera_target, 0.25) }