class_name CameraController extends Camera2D const DRAG_THRESHOLD := 8.0 var _dragging := false var _left_pending := false var _drag_start := Vector2.ZERO func _unhandled_input(event: InputEvent) -> void: if event is InputEventMouseButton: match event.button_index: MOUSE_BUTTON_LEFT: if event.pressed: _left_pending = true _drag_start = event.position else: _left_pending = false if _dragging: _dragging = false Input.set_default_cursor_shape(Input.CURSOR_ARROW) get_viewport().set_input_as_handled() MOUSE_BUTTON_MIDDLE: if event.pressed: _dragging = true _drag_start = event.position Input.set_default_cursor_shape(Input.CURSOR_DRAG) else: _dragging = false Input.set_default_cursor_shape(Input.CURSOR_ARROW) get_viewport().set_input_as_handled() elif event is InputEventMouseMotion: if _left_pending and not _dragging: if event.position.distance_to(_drag_start) >= DRAG_THRESHOLD: _dragging = true _left_pending = false Input.set_default_cursor_shape(Input.CURSOR_DRAG) if _dragging: var delta: Vector2 = _drag_start - event.position _drag_start = event.position position += delta / zoom get_viewport().set_input_as_handled()