TowerGameProto/scripts/ResourceMover.gd

75 lines
1.9 KiB
GDScript3
Raw Normal View History

2025-04-16 22:56:14 +01:00
extends Line2D
signal node_at_end(node: Node)
@export var speed: float = 10.0
var length: float = 1000.0
var transported_objects: Dictionary
var belt_stopped: bool = false
func _ready() -> void:
calculate_length()
func calculate_length() -> void:
length = 0.0
var first: bool = true
var lastPoint: Vector2
for point in points:
if first:
first = false
continue
else:
length += lastPoint.distance_to(point)
lastPoint = point
func get_first_object_progress() -> float:
var least: float = length
for key in transported_objects.keys():
var progress: float = transported_objects.get(key, 0.0)
if progress < least:
least = progress
return least
func position_resource(res: Node2D, progress: float) -> void:
var first: bool = true
var segmentStartPos: Vector2 = Vector2()
var segmentStartProg: float = 0.0
res.z_index = 1
for point in points:
if first:
segmentStartPos = point
first = false
continue
var endProg: float = segmentStartProg + segmentStartPos.distance_to(point)
if progress <= endProg:
var x: float = (progress - segmentStartProg) / (endProg - segmentStartProg)
var pos: Vector2 = segmentStartPos.lerp(point, x)
res.position = pos
return
segmentStartProg = endProg
segmentStartPos = point
func add_transported_object(res: Node) -> void:
if res is Node2D:
transported_objects.set(res, 0);
func remove_transported_object(res: Node) -> void:
if res is Node2D:
var progress: float = transported_objects.get(res, 0.0)
transported_objects.erase(res)
if progress >= length:
belt_stopped = false
func _process(delta: float) -> void:
for key in transported_objects.keys():
var progress: float = transported_objects.get(key, 0.0)
if !belt_stopped:
progress += speed * delta
transported_objects.set(key, progress)
position_resource(key, progress)
if progress >= length:
belt_stopped = true
node_at_end.emit(key)