first commit
This commit is contained in:
121
Scripts/binari_treno.gd
Normal file
121
Scripts/binari_treno.gd
Normal file
@@ -0,0 +1,121 @@
|
||||
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
|
||||
Reference in New Issue
Block a user