63 lines
1.5 KiB
GDScript3
63 lines
1.5 KiB
GDScript3
|
@tool
|
||
|
class_name Conveyor extends Node2D
|
||
|
|
||
|
const GAP = 8.0
|
||
|
const SPEED = 0.0041 # ~ the targeted physics tick time
|
||
|
|
||
|
@export var conveyor_segments: int = 20:
|
||
|
set(v):
|
||
|
conveyor_segments = v
|
||
|
create_segments()
|
||
|
get:
|
||
|
return conveyor_segments
|
||
|
|
||
|
@export var speed_mult: float = 20.0
|
||
|
|
||
|
var conveyor_seg_scn = preload("uid://be7ki66sskav5")
|
||
|
var segments_top: Array[Node2D] = []
|
||
|
var segments_bottom: Array[Node2D] = []
|
||
|
|
||
|
func create_segments():
|
||
|
for c in self.get_children():
|
||
|
c.call_deferred("queue_free")
|
||
|
segments_top = []
|
||
|
segments_bottom = []
|
||
|
# top
|
||
|
for i in range(0, conveyor_segments + 1):
|
||
|
var c = conveyor_seg_scn.instantiate()
|
||
|
c.position.x = i*8.0
|
||
|
self.segments_top.append(c)
|
||
|
self.add_child(c)
|
||
|
# bottom
|
||
|
for i in range(0, conveyor_segments + 1):
|
||
|
var c = conveyor_seg_scn.instantiate()
|
||
|
c.position.x = i*8.0
|
||
|
c.position.y = 5.0
|
||
|
self.segments_bottom.append(c)
|
||
|
self.add_child(c)
|
||
|
|
||
|
func _ready() -> void:
|
||
|
create_segments()
|
||
|
|
||
|
func _process(_delta: float) -> void:
|
||
|
if Engine.is_editor_hint():
|
||
|
return
|
||
|
# make it NOT framerate-depedent bc this would fuck up the positioning over time
|
||
|
var s = sign(speed_mult)
|
||
|
for p in segments_top:
|
||
|
if s > 0.0:
|
||
|
if p.position.x > conveyor_segments * GAP:
|
||
|
p.position.x = 0.0
|
||
|
else:
|
||
|
if p.position.x < 0.0:
|
||
|
p.position.x = conveyor_segments * GAP
|
||
|
p.position.x += SPEED * speed_mult
|
||
|
for p in segments_bottom:
|
||
|
if s > 0.0:
|
||
|
if p.position.x < 0.0:
|
||
|
p.position.x = conveyor_segments * GAP
|
||
|
else:
|
||
|
if p.position.x > conveyor_segments * GAP:
|
||
|
p.position.x = 0.0
|
||
|
p.position.x -= SPEED * speed_mult
|