smashball/scenes/level_camera/level_camera_2d.gd
2025-11-15 09:17:20 -03:00

31 lines
1 KiB
GDScript

extends Camera2D
enum FollowTarget { BALL, PLAYER1, PLAYER2 }
@export_range(0, 1, 0.01) var ball_weight: float = 0.6
@export_range(0, 1, 0.01) var player_weight: float = 0.2
@export var follow_speed: float = 8.0
@export var deadzone_margin: float = 100.0
@onready var ball: RigidBody2D = get_node("../Ball")
@onready var player1: CharacterBody2D = get_node("../Player1")
@onready var player2: CharacterBody2D = get_node("../Player2")
var target_pos: Vector2 = Vector2.ZERO
func _physics_process(delta: float) -> void:
var total_weight: float = ball_weight + player_weight * 2.0
target_pos = (
ball.global_position * ball_weight +
player1.global_position * player_weight +
player2.global_position * player_weight
) / total_weight
global_position = global_position.lerp(target_pos, follow_speed * delta)
var spread: float = maxf(
absf(player1.global_position.x - player2.global_position.x),
absf(player1.global_position.y - player2.global_position.y)
)
var target_zoom: Vector2 = Vector2.ONE * (600.0 / spread)
zoom = target_zoom.limit_length(1.5)