Files

23 lines
1.1 KiB
GDScript
Raw Permalink Normal View History

2026-09-12 11:01:37 +02:00
class_name FpsCamera
extends RefCounted
var previous_position := Vector3.INF
var eye_height := 1.65
static func mouse(p: Fighter, motion: InputEventMouseMotion, sensitivity: float) -> void:
p.yaw = wrapf(p.yaw - motion.screen_relative.x * sensitivity, -PI, PI)
p.pitch = clampf(p.pitch - motion.screen_relative.y * sensitivity, -1.5, 1.5)
func begin_physics(p: Fighter) -> void:
previous_position = p.global_position
func render(p: Fighter, dt: float) -> void:
var base := p.global_position
if previous_position.is_finite() and previous_position.distance_to(base) < 3:
base = previous_position.lerp(base, Engine.get_physics_interpolation_fraction())
eye_height = lerpf(eye_height, 1.0 if p.crouched else 1.65, 1.0 - exp(-dt * 15))
p.blast_shake = move_toward(p.blast_shake, 0, dt * 1.8)
var clock := Time.get_ticks_msec() * 0.001
p.camera.global_position = base + Vector3(sin(clock * 73) * 0.08 * p.blast_shake, eye_height, cos(clock * 59) * 0.04 * p.blast_shake)
p.camera.global_rotation = Vector3(p.pitch, p.yaw, 0) + Vector3(sin(clock * 61) * 0.014, 0, sin(clock * 47) * 0.018) * p.blast_shake