extends Node2D static var can_drag = true # necessary because separate CanvasLayers var is_dragging = false var drag_anchor = Vector2(0,0) var is_touch_drag = false var last_touch_distance = 0 var last_touch_first = null var last_touch_second = null var current_touch_distance = 0 # todo: set camera base limit and adjust based on zoom func _input(event): # open / close Tray if event.is_action_pressed("ui_cancel"): if %Tray.is_open: %Tray.close() else: %Tray.open() # drag screen if can_drag and event.is_action_pressed("drag_screen"): var query1 = PhysicsPointQueryParameters2D.new() query1.collide_with_areas = true query1.position = get_global_mouse_position() query1.canvas_instance_id = $Map.get_instance_id() var collision1 = get_world_2d().direct_space_state.intersect_point(query1) var query2 = PhysicsPointQueryParameters2D.new() query2.collide_with_areas = true query2.position = get_global_mouse_position() query2.canvas_instance_id = $Menu.get_instance_id() var collision2 = get_world_2d().direct_space_state.intersect_point(query2) # todo: figure out how to collide with Tray (solved by can_drag currently) if not collision1 and not collision2: drag_anchor = get_global_mouse_position() is_dragging = true elif event.is_action_released("drag_screen"): is_dragging = false # zoom screen if event is InputEventMouseButton: if event.is_pressed(): if event.button_index == MOUSE_BUTTON_WHEEL_UP: var zoom = min(%Viewport/Camera2D.zoom.x + 0.1, 2) %Viewport/Camera2D.zoom = Vector2(zoom, zoom) if event.button_index == MOUSE_BUTTON_WHEEL_DOWN: var zoom = max(%Viewport/Camera2D.zoom.x - 0.1, 1) %Viewport/Camera2D.zoom = Vector2(zoom, zoom) # touch magnify/pan until https://github.com/godotengine/godot/issues/13139 if event is InputEventScreenTouch and event.index == 1: if event.is_pressed(): is_touch_drag = true else: is_touch_drag = false last_touch_first = null last_touch_second = null if event is InputEventScreenDrag: if event.index == 0: last_touch_first = event elif event.index == 1: last_touch_second = event if is_touch_drag and last_touch_first and last_touch_second: current_touch_distance = last_touch_first.position.distance_to(last_touch_second.position) if last_touch_distance != 0: if current_touch_distance > last_touch_distance: var zoom = min(%Viewport/Camera2D.zoom.x + 0.1, 2) %Viewport/Camera2D.zoom = Vector2(zoom, zoom) elif current_touch_distance < last_touch_distance: var zoom = max(%Viewport/Camera2D.zoom.x - 0.1, 1) %Viewport/Camera2D.zoom = Vector2(zoom, zoom) last_touch_distance = current_touch_distance func _process(_delta): if can_drag and is_dragging: %Viewport.position += drag_anchor - get_global_mouse_position() %Viewport.position.x = min(%Viewport.position.x, %Viewport/Camera2D.limit_right - get_viewport_rect().size.x/2) %Viewport.position.x = max(%Viewport.position.x, %Viewport/Camera2D.limit_left + get_viewport_rect().size.x/2) %Viewport.position.y = min(%Viewport.position.y, %Viewport/Camera2D.limit_bottom - get_viewport_rect().size.y/2) %Viewport.position.y = max(%Viewport.position.y, %Viewport/Camera2D.limit_top + get_viewport_rect().size.y/2)