diff --git a/classes/level/level.gd b/classes/level/level.gd index 8108fd7..4d6d57b 100644 --- a/classes/level/level.gd +++ b/classes/level/level.gd @@ -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") diff --git a/scenes/level_camera/level_camera_2d.gd b/scenes/level_camera/level_camera_2d.gd index 10369a4..32f2e41 100644 --- a/scenes/level_camera/level_camera_2d.gd +++ b/scenes/level_camera/level_camera_2d.gd @@ -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)