From 54967e570b24f8cc8ceedbdf754ade9834d2b531 Mon Sep 17 00:00:00 2001 From: Jeremy Baxter Date: Tue, 27 Jan 2026 12:18:03 +1300 Subject: [PATCH] camera: remove shift lock --- player/camera.gd | 76 ++++++++++++++++++++++++++++++------------------ project.godot | 5 ---- 2 files changed, 47 insertions(+), 34 deletions(-) diff --git a/player/camera.gd b/player/camera.gd index c558b54..07afbeb 100644 --- a/player/camera.gd +++ b/player/camera.gd @@ -1,26 +1,52 @@ class_name CameraGimbal extends Node3D @export var rotation_speed = (PI / 180) * 120 -@export var shift_lock = false @export var default_zoom = 8 -var mouse_locked = false +# is mouse captured by game permanently? +# (i.e. not just holding right click) +var locked = false var mouse_velocity = Vector2.ZERO -var locked_mouse_position = Vector2.ZERO var current_zoom = default_zoom var zoom_min = 4 var zoom_max = 80 var zoom_speed = 20 +func _lock(): + Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) + +func _unlock(): + Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) + mouse_velocity = Vector2.ZERO + +func lock(): + _lock() + locked = true + +# optional API function for nodes that want +# to unlock the mouse for a period of time +func unlock(): + _unlock() + locked = false + func reset(): basis = Basis() $InnerGimbal.basis = Basis() current_zoom = default_zoom -func rotate_camera_y(y, delta): +# y is before x because the outer gimbal is +# in charge of rotating the y axis +func rotate_camera(delta): + var y = 0 + var x = 0 + + if mouse_velocity.x > 5 or mouse_velocity.x < -5: + y -= clamp(mouse_velocity.x / 12.5, -10, 10) + if mouse_velocity.y > 5 or mouse_velocity.y < -5: + x -= clamp(mouse_velocity.y / 12.5, -10, 10) + rotate_object_local(Vector3.UP, y * rotation_speed * delta) -func rotate_camera_x(x, delta): $InnerGimbal.rotate_object_local( Vector3.RIGHT, x * rotation_speed * delta) $InnerGimbal.rotation.x = clamp($InnerGimbal.rotation.x, -0.8, 0.7) @@ -36,34 +62,26 @@ func _input(event): current_zoom = clamp(current_zoom, zoom_min, zoom_max) func _process(delta): - var y = 0 - var x = 0 - - if Input.is_action_just_pressed("shift_lock"): - shift_lock = not shift_lock - if Input.is_mouse_button_pressed(MOUSE_BUTTON_RIGHT) or shift_lock == true: - if mouse_locked == false: - mouse_locked = true - locked_mouse_position = get_viewport().get_mouse_position() - Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED) - - if mouse_velocity.x > 5 or mouse_velocity.x < -5: - y -= clamp(mouse_velocity.x / 12.5, -10, 10) - if mouse_velocity.y > 5 or mouse_velocity.y < -5: - x -= clamp(mouse_velocity.y / 12.5, -10, 10) + # rotate camera + if locked: + rotate_camera(delta) else: - Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE) - mouse_velocity = Vector2.ZERO - mouse_locked = false - - rotate_camera_y(y, delta) - rotate_camera_x(x, delta) - - if Input.is_action_pressed("cam_reset"): - reset() + if Input.is_mouse_button_pressed(MOUSE_BUTTON_RIGHT): + _lock() + rotate_camera(delta) + else: + _unlock() + # zoom in/out var pos = Vector3($InnerGimbal/Camera3D.position) pos.y = lerp(pos.y, float(current_zoom), zoom_speed * delta) pos.z = lerp(pos.z, float(current_zoom), zoom_speed * delta) $InnerGimbal/Camera3D.position = pos + + # reset camera + if Input.is_action_pressed("cam_reset"): + reset() + +func _ready(): + lock() diff --git a/project.godot b/project.godot index a9ffdec..63966a8 100644 --- a/project.godot +++ b/project.godot @@ -67,11 +67,6 @@ backpack_3={ "events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":51,"physical_keycode":0,"key_label":0,"unicode":51,"location":0,"echo":false,"script":null) ] } -shift_lock={ -"deadzone": 0.2, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194325,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) -] -} cam_zoom_in={ "deadzone": 0.2, "events": [Object(InputEventMouseButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"button_mask":0,"position":Vector2(0, 0),"global_position":Vector2(0, 0),"factor":1.0,"button_index":4,"canceled":false,"pressed":false,"double_click":false,"script":null)