From 3e94dd0704d7b4005f17c1086796afdbbe36b1f5 Mon Sep 17 00:00:00 2001 From: Daniel Weipert Date: Fri, 17 May 2024 17:43:29 +0200 Subject: export and more dragging --- Start.gd | 56 +++++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 3 deletions(-) (limited to 'Start.gd') diff --git a/Start.gd b/Start.gd index e7b0896..2ae2895 100644 --- a/Start.gd +++ b/Start.gd @@ -1,21 +1,47 @@ 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() - if event.is_action_pressed("drag_screen"): - drag_anchor = get_global_mouse_position() + # 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: @@ -24,10 +50,34 @@ func _input(event): 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 Input.is_action_pressed("drag_screen"): + 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) -- cgit v1.2.3