74 lines
2.1 KiB
GDScript
74 lines
2.1 KiB
GDScript
extends KinematicBody
|
|
|
|
var speed = 7
|
|
const ACCEL_DEFAULT = 2
|
|
const ACCEL_AIR = 1
|
|
onready var accel = ACCEL_DEFAULT
|
|
var gravity = 9.8
|
|
var jump = 3
|
|
|
|
var cam_accel = 40
|
|
var mouse_sense = 0.1
|
|
var snap
|
|
|
|
var direction = Vector3()
|
|
var velocity = Vector3()
|
|
var gravity_vec = Vector3()
|
|
var movement = Vector3()
|
|
|
|
onready var head = $Head
|
|
onready var camera = $Head/Camera
|
|
|
|
func _ready():
|
|
#hides the cursor
|
|
Input.set_mouse_mode(Input.MOUSE_MODE_CAPTURED)
|
|
|
|
func _input(event):
|
|
#get mouse input for camera rotation
|
|
if event is InputEventMouseMotion:
|
|
rotate_y(deg2rad(-event.relative.x * mouse_sense))
|
|
head.rotate_x(deg2rad(-event.relative.y * mouse_sense))
|
|
head.rotation.x = clamp(head.rotation.x, deg2rad(-89), deg2rad(89))
|
|
|
|
func _process(delta):
|
|
#camera physics interpolation to reduce physics jitter on high refresh-rate monitors
|
|
if Engine.get_frames_per_second() > Engine.iterations_per_second:
|
|
camera.set_as_toplevel(true)
|
|
camera.global_transform.origin = camera.global_transform.origin.linear_interpolate(head.global_transform.origin, cam_accel * delta)
|
|
camera.rotation.y = rotation.y
|
|
camera.rotation.x = head.rotation.x
|
|
else:
|
|
camera.set_as_toplevel(false)
|
|
camera.global_transform = head.global_transform
|
|
|
|
func _physics_process(delta):
|
|
#get keyboard input
|
|
direction = Vector3.ZERO
|
|
var h_rot = global_transform.basis.get_euler().y
|
|
var f_input = Input.get_action_strength("move_backward") - Input.get_action_strength("move_forward")
|
|
var h_input = Input.get_action_strength("move_right") - Input.get_action_strength("move_left")
|
|
direction = Vector3(h_input, 0, f_input).rotated(Vector3.UP, h_rot).normalized()
|
|
|
|
#jumping and gravity
|
|
if is_on_floor():
|
|
snap = -get_floor_normal()
|
|
accel = ACCEL_DEFAULT
|
|
gravity_vec = Vector3.ZERO
|
|
else:
|
|
snap = Vector3.DOWN
|
|
accel = ACCEL_AIR
|
|
gravity_vec += Vector3.DOWN * gravity * delta
|
|
|
|
if Input.is_action_just_pressed("jump") and is_on_floor():
|
|
snap = Vector3.ZERO
|
|
gravity_vec = Vector3.UP * jump
|
|
|
|
#make it move
|
|
velocity = velocity.linear_interpolate(direction * speed, accel * delta)
|
|
movement = velocity + gravity_vec
|
|
|
|
move_and_slide_with_snap(movement, snap, Vector3.UP)
|
|
|
|
|
|
|