generated from krampus/template-godot4
49 lines
1.7 KiB
GDScript
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)
|