summaryrefslogtreecommitdiff
path: root/Start.gd
diff options
context:
space:
mode:
authorDaniel Weipert <git@mail.dweipert.de>2024-05-17 17:43:29 +0200
committerDaniel Weipert <git@mail.dweipert.de>2024-05-17 17:43:56 +0200
commit3e94dd0704d7b4005f17c1086796afdbbe36b1f5 (patch)
tree5183ca775f02a450bbc493193183a06fa3dbc778 /Start.gd
parent07f373ef408f7701b8bfa543ab3c189465f1eed9 (diff)
export and more dragging
Diffstat (limited to 'Start.gd')
-rw-r--r--Start.gd56
1 files changed, 53 insertions, 3 deletions
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)