extends Camera2D # --- Movement Settings --- @export var KEYBOARD_SPEED: float = 500.0 # Pixels per second using keys @export var EDGE_SPEED: float = 600.0 # Pixels per second using mouse edge @export var EDGE_MARGIN: float = 20.0 # How close to the screen edge (in pixels) to trigger scroll # --- Zoom Settings --- @export var MIN_ZOOM: float = 0.5 # Furthest zoomed out @export var MAX_ZOOM: float = 3.0 # Closest zoomed in @export var ZOOM_SPEED: float = 0.1 # How fast it zooms per scroll tick var target_zoom: float = 1.0 # Smoothly interpolate to this value func _ready() -> void: # Ensures the camera uses its actual starting zoom target_zoom = zoom.x func _process(delta: float) -> void: handle_keyboard_movement(delta) handle_edge_scrolling(delta) handle_smooth_zoom(delta) # 1. ARROW KEYS / WASD MOVEMENT func handle_keyboard_movement(delta: float) -> void: var velocity = Vector2.ZERO if Input.is_key_pressed(KEY_LEFT) or Input.is_key_pressed(KEY_A): velocity.x -= 1 if Input.is_key_pressed(KEY_RIGHT) or Input.is_key_pressed(KEY_D): velocity.x += 1 if Input.is_key_pressed(KEY_UP) or Input.is_key_pressed(KEY_W): velocity.y -= 1 if Input.is_key_pressed(KEY_DOWN) or Input.is_key_pressed(KEY_S): velocity.y += 1 # Move the camera based on direction, speed, and time passed global_position += velocity.normalized() * KEYBOARD_SPEED * delta # 2. MOUSE EDGE SCROLLING func handle_edge_scrolling(delta: float) -> void: var mouse_pos = get_viewport().get_mouse_position() var window_size = get_viewport().get_visible_rect().size var velocity = Vector2.ZERO # Check Left/Right edges if mouse_pos.x < EDGE_MARGIN: velocity.x -= 1 elif mouse_pos.x > window_size.x - EDGE_MARGIN: velocity.x += 1 # Check Top/Bottom edges if mouse_pos.y < EDGE_MARGIN: velocity.y -= 1 elif mouse_pos.y > window_size.y - EDGE_MARGIN: velocity.y += 1 global_position += velocity.normalized() * EDGE_SPEED * delta # 3. MOUSE WHEEL ZOOM (Detecting the inputs) func _unhandled_input(event: InputEvent) -> void: if event is InputEventMouseButton: if event.button_index == MOUSE_BUTTON_WHEEL_UP and event.pressed: target_zoom = clamp(target_zoom + ZOOM_SPEED, MIN_ZOOM, MAX_ZOOM) elif event.button_index == MOUSE_BUTTON_WHEEL_DOWN and event.pressed: target_zoom = clamp(target_zoom - ZOOM_SPEED, MIN_ZOOM, MAX_ZOOM) # 4. SMOOTH ZOOMING ANIMATION func handle_smooth_zoom(delta: float) -> void: # Lerp smoothly transitions the current zoom to our target_zoom over time var current_zoom = zoom.x var new_zoom = lerp(current_zoom, target_zoom, 10.0 * delta) zoom = Vector2(new_zoom, new_zoom)