86 lines
2.0 KiB
GDScript
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)
|