33 lines
1.1 KiB
GDScript
33 lines
1.1 KiB
GDScript
class_name LevelCamera extends Camera2D
|
|
|
|
@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
|
|
|
|
var level: Level
|
|
var target_pos: Vector2 = Vector2.ZERO
|
|
|
|
|
|
func _ready() -> void:
|
|
await owner.ready
|
|
level = owner as Level
|
|
assert(level != null, "The LevelCamera type must be used only in the level scene. It needs the owner to be a Level node.")
|
|
|
|
|
|
func follow_gameplay(delta: float) -> void:
|
|
var total_weight: float = ball_weight + player_weight * 2.0
|
|
target_pos = (
|
|
level.ball.global_position * ball_weight +
|
|
level.player_1.global_position * player_weight +
|
|
level.player_2.global_position * player_weight
|
|
) / total_weight
|
|
|
|
global_position = global_position.lerp(target_pos, follow_speed * delta)
|
|
|
|
var spread: float = maxf(
|
|
absf(level.player_1.global_position.x - level.player_2.global_position.x),
|
|
absf(level.player_1.global_position.y - level.player_2.global_position.y)
|
|
)
|
|
var target_zoom: Vector2 = Vector2.ONE * (600.0 / spread)
|
|
zoom = target_zoom.limit_length(1.5)
|