update level camera
This commit is contained in:
parent
7980c821d1
commit
7f9ce27191
2 changed files with 19 additions and 11 deletions
|
|
@ -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")
|
||||
|
|
|
|||
|
|
@ -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)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue