35 lines
1.3 KiB
GDScript
35 lines
1.3 KiB
GDScript
extends KinematicBody
|
|
|
|
const MAX_ANGULAR_VELOCITY = deg2rad(135.0) # rad/s
|
|
const MAX_VELOCITY = 600.0 # m/s
|
|
|
|
export var camera_relative_controls: bool = false
|
|
|
|
func process_player_relative_controls(delta: float):
|
|
rotate_y(Input.get_axis("right", "left") * MAX_ANGULAR_VELOCITY * delta)
|
|
var movement_input = Vector3(0.0, 0.0, Input.get_axis("up", "down"))
|
|
move_and_slide(transform.basis.xform(movement_input) * MAX_VELOCITY * delta)
|
|
update_audio(movement_input.length_squared() > 0.1)
|
|
|
|
func process_camera_relative_controls(delta: float):
|
|
var screen_input = Vector3(Input.get_axis("left", "right"), Input.get_axis("down", "up"), 0.0)
|
|
var world_input = get_viewport().get_camera().global_transform.basis.xform(screen_input)
|
|
var movement_input = world_input - world_input.project(global_transform.basis.y)
|
|
look_at(global_transform.origin + movement_input, Vector3(0.0, 1.0, 0.0))
|
|
move_and_slide(movement_input.normalized() * MAX_VELOCITY * delta)
|
|
update_audio(movement_input.length_squared() > 0.1)
|
|
|
|
func _physics_process(delta):
|
|
if camera_relative_controls:
|
|
process_camera_relative_controls(delta)
|
|
else:
|
|
process_player_relative_controls(delta)
|
|
|
|
func update_audio(is_moving: bool):
|
|
if is_moving != $AudioStreamPlayer.playing:
|
|
$AudioStreamPlayer.playing = is_moving
|
|
|
|
func _on_HitBox_area_entered(area: Area):
|
|
if area.is_in_group("pickup"):
|
|
area.queue_free()
|