69 lines
1.8 KiB
GDScript
69 lines
1.8 KiB
GDScript
class_name ChaseLevelComponent
|
|
extends Node
|
|
|
|
@export var chase_speed: float = 200.0
|
|
@export var chase_target: Marker2D
|
|
@export var phantom_camera: PhantomCamera2D
|
|
@export var minimum_distance: float = 10.0
|
|
signal chase_started
|
|
signal chase_stopped
|
|
var is_chasing: bool = false
|
|
var previous_camera_follow_target: Node2D = null
|
|
|
|
|
|
func _process(delta: float) -> void:
|
|
if not is_chasing:
|
|
return
|
|
|
|
if not chase_target:
|
|
printerr("ChaseLevelComponent: chase_target is not set.")
|
|
return
|
|
|
|
if check_if_reached_target():
|
|
stop_chasing()
|
|
return
|
|
|
|
var target_position: Vector2 = chase_target.global_position
|
|
var current_position: Vector2 = owner.global_position
|
|
var direction: Vector2 = (target_position - current_position).normalized()
|
|
|
|
owner.global_position += direction * chase_speed * delta
|
|
|
|
|
|
func on_ship_entered() -> void:
|
|
if not chase_target:
|
|
printerr("ChaseLevelComponent: chase_target is not set.")
|
|
return
|
|
|
|
if not phantom_camera:
|
|
printerr("ChaseLevelComponent: phantom_camera is not set.")
|
|
return
|
|
|
|
previous_camera_follow_target = phantom_camera.get_follow_target()
|
|
phantom_camera.set_follow_target(owner as Node2D)
|
|
chase_started.emit()
|
|
is_chasing = true
|
|
|
|
|
|
func on_ship_exited() -> void:
|
|
stop_chasing()
|
|
|
|
|
|
func check_if_reached_target() -> bool:
|
|
if not chase_target:
|
|
printerr("ChaseLevelComponent: chase_target is not set.")
|
|
return false
|
|
|
|
var target_position: Vector2 = chase_target.global_position
|
|
var current_position: Vector2 = owner.global_position
|
|
return current_position.distance_to(target_position) < minimum_distance
|
|
|
|
|
|
func stop_chasing() -> void:
|
|
if not phantom_camera:
|
|
printerr("ChaseLevelComponent: phantom_camera is not set.")
|
|
return
|
|
|
|
phantom_camera.set_follow_target(previous_camera_follow_target)
|
|
chase_stopped.emit()
|
|
is_chasing = false |