-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathMapCamera.gd
38 lines (30 loc) · 1.07 KB
/
MapCamera.gd
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
extends Camera2D
export (NodePath) var target
var target_return_enabled = true
var target_return_rate = 0.02
var min_zoom = 0.5
var max_zoom = 2
var zoom_sensitivity = 10
var zoom_speed = 0.05
var events = {}
var last_drag_distance = 0
func _process(_delta):
if target and target_return_enabled and events.size() == 0:
position = lerp(position, get_node(target).position, target_return_rate)
func _unhandled_input(event):
if event is InputEventScreenTouch:
if event.pressed:
events[event.index] = event
else:
events.erase(event.index)
if event is InputEventScreenDrag:
events[event.index] = event
if events.size() == 1:
position -= event.relative.rotated(rotation) * zoom.x
elif events.size() == 2:
var drag_distance = events[0].position.distance_to(events[1].position)
if abs(drag_distance - last_drag_distance) > zoom_sensitivity:
var new_zoom = (1 + zoom_speed) if drag_distance < last_drag_distance else (1 - zoom_speed)
new_zoom = clamp(zoom.x * new_zoom, min_zoom, max_zoom)
zoom = Vector2.ONE * new_zoom
last_drag_distance = drag_distance