Created
January 10, 2021 12:50
-
-
Save WolfgangSenff/e0b8accb0c6d6763b196141691c30f46 to your computer and use it in GitHub Desktop.
A camera script in GDScript that makes for clean pinch-to-zoom and pan-to-drag functionality.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 * 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 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment