A game prototype built with Godot 4 exploring in-world inventory management mechanics.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

46 lines
1.5 KiB

2 years ago
class_name Camera
extends Camera3D
@export var mouse_sensitivity := Vector2(0.2, 0.2) # degrees per pixel
@export var joystick_sensitivity := Vector2(200, 200) # degrees per second
@export var pitch_min := -80.0
@export var pitch_max := 80.0
var current_pitch := 0.0
var current_yaw := 0.0
func _unhandled_input(event: InputEvent) -> void:
# When pressing escape and mouse is currently captured, release it.
if event.is_action_pressed("ui_cancel") && is_mouse_captured():
Input.mouse_mode = Input.MOUSE_MODE_VISIBLE
var button := event as InputEventMouseButton
if button:
# Grab the mouse when pressing the primary mouse button.
# TODO: Make "primary mouse button" configurable.
if event.button_index == MOUSE_BUTTON_LEFT:
Input.mouse_mode = Input.MOUSE_MODE_CAPTURED
var mouseMotion := event as InputEventMouseMotion
if mouseMotion && is_mouse_captured():
apply_rotation(-mouseMotion.relative * mouse_sensitivity)
func _process(delta: float) -> void:
# Handle joystick camera controls.
var input := Input.get_vector("look_left", "look_right", "look_up", "look_down")
apply_rotation(-input * joystick_sensitivity * delta)
# Returns whether the mouse is currently captured by the game.
func is_mouse_captured() -> bool:
return Input.mouse_mode == Input.MOUSE_MODE_CAPTURED
# Applies the specified rotation (in degrees) to the camera.
func apply_rotation(delta: Vector2) -> void:
delta = delta / 360 * TAU
current_pitch = clampf(current_pitch + delta.y, deg_to_rad(pitch_min), deg_to_rad(pitch_max))
current_yaw += delta.x