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