initial commit
This commit is contained in:
47
multitargetcamera.gd
Normal file
47
multitargetcamera.gd
Normal file
@@ -0,0 +1,47 @@
|
||||
extends Camera2D
|
||||
|
||||
@export var move_speed = 3 # camera position lerp speed
|
||||
@export var zoom_speed = 3 # camera zoom lerp speed for zooming in
|
||||
@export var min_zoom = 5 # camera won't zoom closer than this
|
||||
@export var max_zoom = 1 # camera won't zoom farther than this
|
||||
@export var margin = Vector2(400, 200) # include some buffer area around targets
|
||||
|
||||
var targets = []
|
||||
|
||||
@onready var screen_size = get_viewport_rect().size
|
||||
|
||||
func _process(delta):
|
||||
if !targets:
|
||||
return
|
||||
|
||||
# Keep the camera centered among all targets
|
||||
var p = Vector2.ZERO
|
||||
for target in targets:
|
||||
p += target.position
|
||||
p /= targets.size()
|
||||
position = lerp(position, p, move_speed * delta)
|
||||
|
||||
# Find the zoom that will contain all targets
|
||||
var r = Rect2(position, Vector2.ONE)
|
||||
for target in targets:
|
||||
r = r.expand(target.position)
|
||||
r = r.grow_individual(margin.x, margin.y, margin.x, margin.y)
|
||||
var z
|
||||
if r.size.x > r.size.y * screen_size.aspect():
|
||||
z = 1 / clamp(r.size.x / screen_size.x, max_zoom, min_zoom)
|
||||
else:
|
||||
z = 1 / clamp(r.size.y / screen_size.y, max_zoom, min_zoom)
|
||||
|
||||
# Apply zoom instantly if zooming out, or lerp if zooming in
|
||||
#if z < zoom.x: # Zooming in (smaller zoom level)
|
||||
zoom = lerp(zoom, Vector2.ONE * z, zoom_speed * delta)
|
||||
#else: # Zooming out (larger zoom level)
|
||||
#zoom = Vector2.ONE * z
|
||||
|
||||
func add_target(t):
|
||||
if not t in targets:
|
||||
targets.append(t)
|
||||
|
||||
func remove_target(t):
|
||||
if t in targets:
|
||||
targets.erase(t)
|
||||
Reference in New Issue
Block a user