Skip to content

Instantly share code, notes, and snippets.

@WolfgangSenff
Created January 10, 2021 12:50
Show Gist options
  • Save WolfgangSenff/e0b8accb0c6d6763b196141691c30f46 to your computer and use it in GitHub Desktop.
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.
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