58 lines
1.8 KiB
GDScript
58 lines
1.8 KiB
GDScript
extends CharacterBody3D
|
|
|
|
const SPEED = 5.0
|
|
const JUMP_VELOCITY = 4.5
|
|
const SENSITIVITY = 0.005
|
|
|
|
var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")
|
|
|
|
@onready var head = $Head
|
|
@onready var camera = $Head/Camera3D
|
|
@onready var dash_timer = $DashTimer
|
|
@onready var player_debug = $Head/Camera3D/PlayerDebug
|
|
|
|
func _ready() -> void:
|
|
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
|
|
|
|
func _unhandled_input(event: InputEvent) -> void:
|
|
if event is InputEventMouseMotion:
|
|
head.rotate_y(-event.relative.x * SENSITIVITY)
|
|
camera.rotate_x(-event.relative.y * SENSITIVITY)
|
|
camera.rotation.x = clamp(camera.rotation.x, deg_to_rad(-40), deg_to_rad(80))
|
|
|
|
if Input.is_action_just_pressed("ui_cancel"):
|
|
Input.set_mouse_mode(Input.MOUSE_MODE_VISIBLE)
|
|
|
|
if Input.is_action_just_pressed("debug_overlay"):
|
|
player_debug.visible = !player_debug.visible
|
|
|
|
func _physics_process(delta: float) -> void:
|
|
if not is_on_floor():
|
|
velocity.y -= gravity * delta
|
|
|
|
if Input.is_action_just_pressed("jump") and is_on_floor():
|
|
velocity.y = JUMP_VELOCITY
|
|
|
|
var input_dir = Input.get_vector("move_left", "move_right", "move_forward", "move_backward")
|
|
var direction = (head.transform.basis * Vector3(input_dir.x, 0, input_dir.y)).normalized()
|
|
|
|
if direction:
|
|
velocity.x = direction.x * SPEED
|
|
velocity.z = direction.z * SPEED
|
|
else:
|
|
velocity.x = 0.0
|
|
velocity.z = 0.0
|
|
|
|
if Input.is_action_just_pressed("dash") and dash_timer.is_stopped():
|
|
velocity.x = velocity.x * 10
|
|
velocity.z = velocity.z * 10
|
|
dash_timer.start()
|
|
|
|
if player_debug.visible:
|
|
player_debug.add_stat("vel_x", str(velocity.x))
|
|
player_debug.add_stat("vel_y", str(velocity.y))
|
|
player_debug.add_stat("vel_z", str(velocity.z))
|
|
player_debug.add_stat("dash_cd", str(dash_timer.time_left))
|
|
|
|
move_and_slide()
|