ygdra/entity/player.gd

86 lines
2.0 KiB
GDScript

class_name Player
extends Spatial
# Parameters
var speed = 4 # m/s
var spin = PI/2 # rad/s
# By default, not moving and not turning
var moving = false
var turning = false
# When moving, these are not null
var moving_vel = null
var target_pos = null
var turning_ang = 0.0
var orig_ang = 0.0
var target_ang = 0.0
# Move at position
func teleport_at(v: Vector3):
transform.origin = v + Vector3(0, 0.5, 0)
# Look at a direction
func turn_at(dir):
match dir:
Direction.NORTH:
rotation.y = 0
Direction.SOUTH:
rotation.y = PI
Direction.EAST:
rotation.y = -PI/2
Direction.WEST:
rotation.y = PI/2
# Indicate if player is moving or turning
func in_movement():
return moving or turning
# Move forward
func move_forward():
if not in_movement():
moving = true
moving_vel = Vector3.FORWARD
moving_vel *= speed
target_pos = to_global(2 * Vector3.FORWARD)
func move_backward():
if not in_movement():
moving = true
moving_vel = Vector3.BACK
moving_vel *= speed
target_pos = to_global(2 * Vector3.BACK)
func turn_left():
if not in_movement():
turning = true
orig_ang = rotation.y
target_ang = rotation.y + PI/2
turning_ang = 0.0
func turn_right():
if not in_movement():
turning = true
orig_ang = rotation.y
target_ang = rotation.y - PI/2
turning_ang = 0.0
#
func _physics_process(delta):
if moving:
if transform.origin.distance_to(target_pos) < 0.01:
# Move at target pos
transform.origin = target_pos
moving = false
else:
var velocity = moving_vel * delta
translate_object_local(velocity)
if turning:
if abs(rotation.y - target_ang) < 0.05:
# set angle
rotation.y = target_ang
turning = false
else:
turning_ang += spin * delta
rotation.y = lerp_angle(orig_ang, target_ang, turning_ang)