57 lines
1.4 KiB
GDScript
57 lines
1.4 KiB
GDScript
class_name MoveAction
|
|
extends "res://cutscene/Action.gd"
|
|
|
|
# Properties
|
|
var character: Node2D # The character to move
|
|
var target_position: Vector2 # Target position
|
|
var speed: float = 100.0 # Movement speed (pixels/second)
|
|
var threshold: float = 5.0 # Distance threshold for completion
|
|
|
|
# Internal
|
|
var start_position: Vector2
|
|
var distance: float
|
|
var traveled: float = 0.0
|
|
|
|
func _init(character_node: Node2D, target: Vector2, move_speed: float = 100.0) -> void:
|
|
character = character_node
|
|
target_position = target
|
|
speed = move_speed
|
|
name = "MoveAction"
|
|
|
|
func start() -> void:
|
|
print("started", character)
|
|
if character == null:
|
|
self._set_failed("Character is null")
|
|
return
|
|
|
|
start_position = character.position
|
|
distance = start_position.distance_to(target_position)
|
|
traveled = 0.0
|
|
self._set_running()
|
|
|
|
func update(delta: float) -> void:
|
|
print ("updating")
|
|
if state != State.RUNNING:
|
|
return
|
|
|
|
if character == null:
|
|
self._set_failed("Character was destroyed during action")
|
|
return
|
|
|
|
# Calculate movement for this frame
|
|
var frame_distance = speed * delta
|
|
traveled += frame_distance
|
|
|
|
# If we've reached or overshot the target
|
|
if traveled >= distance:
|
|
character.position = target_position
|
|
self._set_completed()
|
|
return
|
|
|
|
# Move character along the path
|
|
var direction = (target_position - start_position).normalized()
|
|
character.position = start_position + direction * traveled
|
|
|
|
func is_completed() -> bool:
|
|
return state == State.COMPLETED
|