update level camera

This commit is contained in:
yuki 2025-11-19 14:40:04 -03:00
parent 7980c821d1
commit 7f9ce27191
2 changed files with 19 additions and 11 deletions

View file

@ -2,6 +2,7 @@ class_name Level extends Node2D
@export var director: StateMachine
@export var camera: Camera2D
@export var player_1_spawn: PlayerSpawnPoint
@export var player_2_spawn: PlayerSpawnPoint
@export var ball_spawn: BallSpawnPoint
@ -14,9 +15,14 @@ var player_1: Player
var player_2: Player
var ball: Ball
var scoreboard: Vector2i
var current_round: int
var restarted: bool
func _ready() -> void:
# :sheesh:
assert(director != null, "no director set")
assert(camera != null, "no camera set")
assert(player_1_spawn != null, "no player 1 spawn point set")
assert(player_2_spawn != null, "no player 2 spawn point set")
assert(ball_spawn != null, "no ball spawn point set")

View file

@ -1,31 +1,33 @@
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: Ball = get_node("../Ball")
@onready var player1: Player = get_node("../Player1")
@onready var player2: Player = get_node("../Player2")
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 _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
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(player1.global_position.x - player2.global_position.x),
absf(player1.global_position.y - player2.global_position.y)
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)