Files
batrix/scripts/main_camera.gd
2025-02-27 19:27:03 +10:00

62 lines
1.5 KiB
GDScript

class_name MainCamera
extends Camera3D
@export var _height_offset: float = 0.5
@export var _distance: float = 50
@export var _angle_degrees: Vector3 = Vector3(-35, -45, 0)
@export var _aim_offset_factor_mouse: float = 0.2
@export var _aim_offset_factor_controller: float = 0.5
@export var _aim_damping: float = 1
var _floor_height: float = 0
var _aim_offset: Vector3
func _ready() -> void:
Referencer.main_camera = self
func _process(delta: float) -> void:
var follow_position: Vector3 = Vector3.ZERO
for player in Referencer.players:
follow_position += _follow(player, delta)
follow_position /= Referencer.players.size()
global_rotation_degrees = _angle_degrees
global_position = (
follow_position + Vector3.UP * _height_offset + transform.basis.z * _distance
)
func _follow(player: Player, delta: float) -> Vector3:
var player_position := player.global_position
if player.is_on_floor():
_floor_height = player_position.y
player_position.y = _floor_height + Projectile.HEIGHT
if Inputer.mode == Inputer.Mode.KB_MOUSE:
_aim_offset = player.aiming.aim_offset
else:
var new_aim_offset := (
Vector3.ZERO
if player.aiming.aim_input.length() == 0
else player.aiming.aim_offset
)
_aim_offset = _aim_offset.lerp(new_aim_offset, _aim_damping * delta)
var follow_position := (
player_position
+ (
_aim_offset
* (
_aim_offset_factor_mouse
if Inputer.mode == Inputer.Mode.KB_MOUSE
else _aim_offset_factor_controller
)
)
)
Debugger.circle("follow_position" + str(player.index), follow_position)
return follow_position