69 lines
1.9 KiB
GDScript
69 lines
1.9 KiB
GDScript
extends NodeState
|
|
|
|
@export var character: NonPlayableCharacter
|
|
@export var animated_sprite_2d: AnimatedSprite2D
|
|
@export var navigation_agent_2d: NavigationAgent2D
|
|
@export var min_speed: float = 5.0
|
|
@export var max_speed: float = 10.0
|
|
|
|
var speed: float
|
|
|
|
|
|
func _ready() -> void:
|
|
navigation_agent_2d.velocity_computed.connect(on_safe_velocity_computed)
|
|
call_deferred("character_setup")
|
|
|
|
func on_safe_velocity_computed(safe_velocity: Vector2) -> void:
|
|
animated_sprite_2d.flip_h = safe_velocity.x < 0
|
|
character.velocity = safe_velocity
|
|
character.move_and_slide()
|
|
|
|
|
|
func character_setup() -> void:
|
|
await get_tree().physics_frame
|
|
|
|
set_movement_target()
|
|
|
|
func set_movement_target() -> void:
|
|
var target_position: Vector2 = NavigationServer2D.map_get_random_point(navigation_agent_2d.get_navigation_map(), navigation_agent_2d.navigation_layers, false)
|
|
navigation_agent_2d.target_position = target_position
|
|
speed = randf_range(min_speed, max_speed)
|
|
|
|
|
|
func _on_process(_delta : float) -> void:
|
|
pass
|
|
|
|
|
|
func _on_physics_process(_delta : float) -> void:
|
|
if navigation_agent_2d.is_navigation_finished():
|
|
character.current_walk_cycle += 1
|
|
set_movement_target()
|
|
return
|
|
|
|
var target_position: Vector2 = navigation_agent_2d.get_next_path_position()
|
|
var target_direction: Vector2 = character.global_position.direction_to(target_position)
|
|
|
|
var velocity: Vector2 = target_direction * speed
|
|
if navigation_agent_2d.avoidance_enabled:
|
|
animated_sprite_2d.flip_h = velocity.x < 0
|
|
navigation_agent_2d.velocity = velocity
|
|
else:
|
|
character.velocity = velocity
|
|
character.move_and_slide()
|
|
|
|
|
|
|
|
func _on_next_transitions() -> void:
|
|
if character.current_walk_cycle == character.walk_cycles:
|
|
character.velocity = Vector2.ZERO
|
|
transition.emit("Idle")
|
|
|
|
|
|
func _on_enter() -> void:
|
|
animated_sprite_2d.play("walk")
|
|
character.current_walk_cycle = 0
|
|
|
|
|
|
func _on_exit() -> void:
|
|
animated_sprite_2d.stop()
|