51 lines
1.0 KiB
GDScript
51 lines
1.0 KiB
GDScript
@tool
|
|
class_name SelfMovingPlatform
|
|
extends AbstractPlatform
|
|
|
|
|
|
const SPEED_FACTOR = 0.025
|
|
const ANIMATION_ACTIVE = "active"
|
|
|
|
|
|
@export var is_loop := false
|
|
@export var path_follow : PathFollow2D
|
|
@export_range(0, 25, 0.1) var speed : float = 10.0
|
|
|
|
|
|
var is_reverse := false
|
|
var tween: Tween
|
|
|
|
|
|
func _ready() -> void:
|
|
super._ready()
|
|
icon_sprite.play(ANIMATION_ACTIVE)
|
|
if not Engine.is_editor_hint():
|
|
_start_movement()
|
|
|
|
|
|
func _start_movement() -> void:
|
|
if tween and tween.is_running():
|
|
tween.kill()
|
|
|
|
var target := 0.0 if is_reverse else 1.0
|
|
var distance := absf(target - path_follow.progress_ratio)
|
|
var duration := distance / (speed * SPEED_FACTOR)
|
|
|
|
tween = create_tween()
|
|
|
|
if not is_loop:
|
|
tween.set_trans(Tween.TRANS_SINE)
|
|
tween.set_ease(Tween.EASE_IN_OUT)
|
|
tween.finished.connect(_on_tween_finished)
|
|
|
|
tween.tween_property(path_follow, "progress_ratio", target, duration)
|
|
|
|
|
|
func _on_tween_finished() -> void:
|
|
if is_loop:
|
|
path_follow.progress_ratio = 0
|
|
else:
|
|
is_reverse = not is_reverse
|
|
|
|
_start_movement()
|