summaryrefslogtreecommitdiff
path: root/Start.gd
blob: 2ae2895cf1f7f35a90d63cbdd84eae8c62d4e26a (plain)
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)