grunk/src/player/camera_controller.gd

49 lines
1.7 KiB
GDScript

class_name CameraController extends Node3D
const PITCH_LIMIT := deg_to_rad(85.0)
const FOCUS_SENSITIVITY := 0.2
const FOCUS_ACCELERATION := 8
@onready var player: Player = owner
@onready var _target := Vector2(rotation.x, rotation.y)
func _unhandled_input(event: InputEvent) -> void:
if event is InputEventMouseMotion:
if Input.get_mouse_mode() == Input.MOUSE_MODE_CAPTURED:
camera_motion((event as InputEventMouseMotion).relative)
elif event is InputEventMouseButton:
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
elif event is InputEventKey:
if (event as InputEventKey).keycode == KEY_ESCAPE:
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
func camera_motion(motion: Vector2) -> void:
var x_sensitivity: float = ProjectSettings.get_setting("game/config/input/mouse_sensitivity_x")
var y_sensitivity: float = ProjectSettings.get_setting("game/config/input/mouse_sensitivity_y")
var invert_pitch: bool = ProjectSettings.get_setting("game/config/input/invert_pitch")
if player.firing:
# Focus movement when firing
# Game mechanic, should not be user-configurable.
x_sensitivity = FOCUS_SENSITIVITY
y_sensitivity = FOCUS_SENSITIVITY
_target.y -= deg_to_rad(motion.x * x_sensitivity)
_target.x = clampf(
_target.x - deg_to_rad(motion.y * y_sensitivity) * (-1 if invert_pitch else 1),
-PITCH_LIMIT,
PITCH_LIMIT
)
func _physics_process(_delta: float) -> void:
var mouse_accel: float = (
ProjectSettings.get_setting("game/config/input/mouse_acceleration") / 60.0
)
if player.firing:
mouse_accel = FOCUS_ACCELERATION / 60.0
rotation.y = lerp_angle(rotation.y, _target.y, mouse_accel)
rotation.x = lerp_angle(rotation.x, _target.x, mouse_accel)