75 lines
1.9 KiB
GDScript
75 lines
1.9 KiB
GDScript
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)
|