diff --git a/Player/player.gd b/Player/player.gd index 9877e45..bb5c8fe 100644 --- a/Player/player.gd +++ b/Player/player.gd @@ -1,14 +1,20 @@ class_name Player extends CharacterBody3D @export_category("Player") -@export_range(1, 35, 1) var speed: float = 10 # m/s +@export_range(1, 35, 1) var speed: float = 5 # m/s @export_range(10, 400, 1) var acceleration: float = 100 # m/s^2 - @export_range(0.1, 3.0, 0.1) var jump_height: float = 1 # m @export_range(0.1, 3.0, 0.1, "or_greater") var camera_sens: float = 1 +@export var sprint_speed: float = 7.0 +@export var crouch_speed: float = 2.5 +var normal_speed: float = speed + +@export var jump_buffer_time: float = 0.2 + var jumping: bool = false var mouse_captured: bool = false +var jump_buffer: float = 0 var gravity: float = ProjectSettings.get_setting("physics/3d/default_gravity") @@ -32,6 +38,8 @@ func _unhandled_input(event: InputEvent) -> void: if Input.is_action_just_pressed("exit"): get_tree().quit() func _physics_process(delta: float) -> void: + if jump_buffer > 0: + jump_buffer -= delta if mouse_captured: _handle_joypad_camera_rotation(delta) velocity = _walk(delta) + _gravity(delta) + _jump(delta) move_and_slide() @@ -56,10 +64,25 @@ func _handle_joypad_camera_rotation(delta: float, sens_mod: float = 1.0) -> void look_dir = Vector2.ZERO func _walk(delta: float) -> Vector3: + # Handling sprint and crouch mechanics + if Input.is_action_pressed("sprint"): + speed = sprint_speed + elif Input.is_action_pressed("crouch"): + speed = crouch_speed + else: + speed = normal_speed + + # Get movement input move_dir = Input.get_vector("move_left", "move_right", "move_forward", "move_backwards") var _forward: Vector3 = camera.global_transform.basis * Vector3(move_dir.x, 0, move_dir.y) var walk_dir: Vector3 = Vector3(_forward.x, 0, _forward.z).normalized() - walk_vel = walk_vel.move_toward(walk_dir * speed * move_dir.length(), acceleration * delta) + + # Apply stopping when there's no input + if move_dir.length() < 0.1: + walk_vel = Vector3.ZERO + else: + walk_vel = walk_vel.move_toward(walk_dir * speed * move_dir.length(), acceleration * delta) + return walk_vel func _gravity(delta: float) -> Vector3: @@ -67,8 +90,10 @@ func _gravity(delta: float) -> Vector3: return grav_vel func _jump(delta: float) -> Vector3: - if jumping: - if is_on_floor(): jump_vel = Vector3(0, sqrt(4 * jump_height * gravity), 0) + if jumping and jump_buffer <= 0: + if is_on_floor(): + jump_vel = Vector3(0, sqrt(4 * jump_height * gravity), 0) + jump_buffer = jump_buffer_time jumping = false return jump_vel jump_vel = Vector3.ZERO if is_on_floor() else jump_vel.move_toward(Vector3.ZERO, gravity * delta) diff --git a/README.md b/README.md index 27ef960..66a5511 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,8 @@ The main scene is a _Sandbox_ scene used to test the controls: | W,A,S,D, left stick | `move_` + _dir_ | Move | | `mouse`, right stick | `look_` + _dir_ | Look/Aim | | Space, Xbox Ⓐ | `jump` | Apply jump force | +| Shift, Xbox LB | `sprint` | Increase movement speed (Sprint) | +| Ctrl, Xbox RB | `crouch` | Decrease movement speed (Crouch) | | ESC, Xbox Ⓑ | `exit` | Close the game | You can change any of this keys in: Project Settings → Input Map. diff --git a/project.godot b/project.godot index 82bed97..0439873 100644 --- a/project.godot +++ b/project.godot @@ -12,49 +12,51 @@ config_version=5 config/name="BasicFPC" run/main_scene="res://Sandbox.tscn" -config/features=PackedStringArray("4.1") +config/features=PackedStringArray("4.3") config/icon="res://icon.svg" [display] -window/size/viewport_width=1280 -window/size/viewport_height=720 +window/size/viewport_width=1920 +window/size/viewport_height=1080 +window/size/mode=2 +window/stretch/mode="viewport" [input] move_forward={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":0,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":87,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) , Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":-1.0,"script":null) ] } move_backwards={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":0,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":83,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) , Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":1,"axis_value":1.0,"script":null) ] } move_right={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":0,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":68,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) , Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":1.0,"script":null) ] } move_left={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":0,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":65,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) , Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":0,"axis_value":-1.0,"script":null) ] } jump={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":0,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":32,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":0,"pressure":0.0,"pressed":true,"script":null) ] } exit={ "deadzone": 0.5, -"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194305,"key_label":0,"unicode":0,"echo":false,"script":null) +"events": [Object(InputEventKey,"resource_local_to_scene":false,"resource_name":"","device":0,"window_id":0,"alt_pressed":false,"shift_pressed":false,"ctrl_pressed":false,"meta_pressed":false,"pressed":false,"keycode":0,"physical_keycode":4194305,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) , Object(InputEventJoypadButton,"resource_local_to_scene":false,"resource_name":"","device":-1,"button_index":1,"pressure":0.0,"pressed":true,"script":null) ] } @@ -78,3 +80,17 @@ look_left={ "events": [Object(InputEventJoypadMotion,"resource_local_to_scene":false,"resource_name":"","device":-1,"axis":2,"axis_value":-1.0,"script":null) ] } +sprint={ +"deadzone": 0.5, +"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) +] +} +crouch={ +"deadzone": 0.5, +"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":4194326,"key_label":0,"unicode":0,"location":0,"echo":false,"script":null) +] +} + +[physics] + +3d/default_gravity=15.0