122 lines
4.2 KiB
GDScript
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
|