78 lines
1.9 KiB
GDScript
78 lines
1.9 KiB
GDScript
class_name EntityMovement extends Node
|
|
|
|
enum MovementType {
|
|
PLAYER_INPUT,
|
|
STILL,
|
|
NPC_RANDOM_LOOK
|
|
};
|
|
|
|
@export var characterBody:CharacterBody3D = null;
|
|
@export var entity:Entity = null;
|
|
@export var entityDirection:EntityDirection = null;
|
|
|
|
@export var speed:float = 200;
|
|
@export var runSpeed:float = 400;
|
|
@export var friction:float = 8.5;
|
|
@export var gravity:float = 30;
|
|
|
|
@export var movementType:MovementType = MovementType.STILL;
|
|
|
|
@export var randomLookMinTime:float = 1.5;
|
|
@export var randomLookMaxTime:float = 4.0;
|
|
var randomLookTimer:float = 0.0;
|
|
|
|
func _physics_process(delta:float) -> void:
|
|
if !entity || entity.isPaused() || !characterBody:
|
|
return;
|
|
|
|
# Update movement
|
|
_updateVelocity(delta)
|
|
|
|
# Gravity and friction
|
|
if !characterBody.is_on_floor():
|
|
characterBody.velocity.y -= gravity * delta;
|
|
else:
|
|
characterBody.velocity += -(characterBody.velocity * friction * delta);
|
|
# if velocity.length() != 0:
|
|
# _updateTileData();
|
|
|
|
# Update character controller.
|
|
characterBody.move_and_slide();
|
|
|
|
func _updateVelocity(delta:float):
|
|
match movementType:
|
|
MovementType.PLAYER_INPUT:
|
|
_updatePlayerInput(delta);
|
|
MovementType.STILL:
|
|
_updateStill(delta);
|
|
MovementType.NPC_RANDOM_LOOK:
|
|
_updateNPCRandomLook(delta);
|
|
|
|
func _updatePlayerInput(delta:float) -> void:
|
|
var dir:Vector2 = Input.get_vector("left", "right", "up", "down");
|
|
|
|
var moveSpeed:float;
|
|
if Input.is_action_pressed("run"):
|
|
moveSpeed = runSpeed;
|
|
else:
|
|
moveSpeed = speed;
|
|
|
|
if dir.x != 0 or dir.y != 0:
|
|
characterBody.velocity.x = dir.x * moveSpeed * delta;
|
|
characterBody.velocity.z = dir.y * moveSpeed * delta;
|
|
|
|
if entityDirection:
|
|
entityDirection.updateDirectionFromMovement(dir);
|
|
|
|
func _updateStill(delta:float):
|
|
pass
|
|
|
|
func _updateNPCRandomLook(delta:float):
|
|
if !entityDirection:
|
|
return
|
|
randomLookTimer -= delta;
|
|
|
|
if randomLookTimer <= 0:
|
|
randomLookTimer = randf_range(randomLookMinTime, randomLookMaxTime);
|
|
entityDirection.direction = randi_range(0, 3);
|