Files
tgcc-artest/Scripts/binari_treno.gd
Matteo Sonaglioni f7b334b21c first commit
2026-03-10 23:54:57 +01:00

122 lines
4.2 KiB
GDScript

extends Path3D
@export_group("Impostazioni Treno")
@export var velocita_treno: float = 6.0
@export var in_movimento: bool = true
@export_group("Costruzione Rotaie")
@export var distanza_traversine: float = 1.0 # Ogni quanti metri mettere un asse di legno
var nodo_treno: PathFollow3D
func _ready() -> void:
# Controlla se hai disegnato il percorso
if curve == null or curve.get_baked_length() == 0:
print("ATTENZIONE: Devi prima disegnare i punti del Path3D!")
return
_costruisci_rotaie_da_zero()
_costruisci_treno_da_zero()
func _costruisci_rotaie_da_zero() -> void:
# 1. Creiamo i materiali (Colori) per le rotaie
var mat_legno = StandardMaterial3D.new()
mat_legno.albedo_color = Color(0.35, 0.2, 0.1) # Marrone scuro
var mat_ferro = StandardMaterial3D.new()
mat_ferro.albedo_color = Color(0.6, 0.6, 0.65) # Grigio metallico
mat_ferro.metallic = 0.8
# 2. Creiamo le forme geometriche base (Box)
var mesh_traversina = BoxMesh.new()
mesh_traversina.size = Vector3(1.8, 0.1, 0.3)
var mesh_binario = BoxMesh.new()
# La lunghezza del binario è uguale alla distanza tra le traversine per connettersi perfettamente
mesh_binario.size = Vector3(0.1, 0.15, distanza_traversine + 0.05)
# 3. Calcoliamo quanti pezzi servono
var lunghezza_totale = curve.get_baked_length()
var numero_pezzi = int(lunghezza_totale / distanza_traversine)
# 4. Piazziamo i pezzi lungo la curva
for i in range(numero_pezzi):
var distanza = i * distanza_traversine
var transform_punto = curve.sample_baked_with_rotation(distanza, true, true)
# Nodo "Pezzo" che fa da raggruppamento
var pezzo_binario = Node3D.new()
pezzo_binario.transform = transform_punto
add_child(pezzo_binario)
# Creiamo la traversina in legno
var traversina = MeshInstance3D.new()
traversina.mesh = mesh_traversina
traversina.material_override = mat_legno
pezzo_binario.add_child(traversina)
# Creiamo il binario sinistro
var binario_sx = MeshInstance3D.new()
binario_sx.mesh = mesh_binario
binario_sx.material_override = mat_ferro
binario_sx.position = Vector3(-0.6, 0.1, 0) # Spostato a sinistra e leggermente in alto
pezzo_binario.add_child(binario_sx)
# Creiamo il binario destro
var binario_dx = MeshInstance3D.new()
binario_dx.mesh = mesh_binario
binario_dx.material_override = mat_ferro
binario_dx.position = Vector3(0.6, 0.1, 0) # Spostato a destra e leggermente in alto
pezzo_binario.add_child(binario_dx)
func _costruisci_treno_da_zero() -> void:
# 1. Creiamo il PathFollow che gestisce il movimento
nodo_treno = PathFollow3D.new()
nodo_treno.rotation_mode = PathFollow3D.ROTATION_Y # IMPORTANTE: Evita che il treno si inclini di lato
nodo_treno.cubic_interp = false # Rende la velocità costante ed elimina i tremolii
nodo_treno.loop = true
add_child(nodo_treno)
# 2. Materiali del treno
var mat_carrozzeria = StandardMaterial3D.new()
mat_carrozzeria.albedo_color = Color(0.8, 0.15, 0.15) # Rosso acceso
var mat_vetro = StandardMaterial3D.new()
mat_vetro.albedo_color = Color(0.2, 0.8, 1.0) # Azzurro
# 3. Costruiamo la Base del treno
var base_treno = MeshInstance3D.new()
var mesh_base = BoxMesh.new()
mesh_base.size = Vector3(1.4, 0.8, 3.0)
base_treno.mesh = mesh_base
base_treno.material_override = mat_carrozzeria
base_treno.position = Vector3(0, 0.6, 0) # Alzato per stare sopra le rotaie
nodo_treno.add_child(base_treno)
# 4. Costruiamo la Cabina del macchinista
var cabina = MeshInstance3D.new()
var mesh_cabina = BoxMesh.new()
mesh_cabina.size = Vector3(1.4, 1.0, 1.2)
cabina.mesh = mesh_cabina
cabina.material_override = mat_vetro
cabina.position = Vector3(0, 1.5, -0.8) # Messa dietro e in alto
nodo_treno.add_child(cabina)
# 5. Costruiamo la Ciminiera (davanti)
var ciminiera = MeshInstance3D.new()
var mesh_ciminiera = CylinderMesh.new()
mesh_ciminiera.top_radius = 0.2
mesh_ciminiera.bottom_radius = 0.3
mesh_ciminiera.height = 0.8
ciminiera.mesh = mesh_ciminiera
ciminiera.material_override = mat_carrozzeria
ciminiera.position = Vector3(0, 1.2, 1.0)
nodo_treno.add_child(ciminiera)
func _process(delta: float) -> void:
# Se in movimento, fa avanzare automaticamente il nodo_treno lungo la curva
if in_movimento and nodo_treno:
nodo_treno.progress += velocita_treno * delta