1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
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)
|