43 lines
1.2 KiB
GDScript
43 lines
1.2 KiB
GDScript
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()
|