Add Procedural Map

This commit is contained in:
Matteo Sonaglioni
2026-03-11 13:05:36 +01:00
parent f7b334b21c
commit 47380d3137
29 changed files with 1568 additions and 179 deletions

View File

@@ -2,17 +2,18 @@ extends Node3D
@export_group("Riferimenti Camere")
@export var camera_iso : Camera3D
@export var pivot_iso : Node3D # <-- NUOVO: Trascina qui il nodo PivotIso!
@export var camera_frontale : Camera3D
@export var camera_laterale : Camera3D
@export var camera_laterale_2 : Camera3D # Nuova Camera 4
@export var camera_alta : Camera3D # Nuova Camera 5
@export var camera_laterale_2 : Camera3D
@export var camera_alta : Camera3D
@export_group("Movimento Camera 1")
@export var move_speed : float = 20.0
@export var rotation_speed : float = 0.2
@export_group("Cinematic Mode")
@export var tempo_cambio_camera : float = 10.0 # Quanti secondi dura ogni inquadratura
@export var tempo_cambio_camera : float = 10.0
var is_moving_enabled : bool = true
@@ -22,28 +23,38 @@ var cinematic_timer : float = 0.0
var cinematic_index : int = 0
var array_camere : Array[Camera3D] = []
# --- Variabile per il Reset ---
var transform_iniziale_pivot : Transform3D
func _ready():
# Creiamo un array con le telecamere valide per ciclarle facilmente
# Salviamo la posizione e rotazione del PIVOT, non della camera!
if pivot_iso:
transform_iniziale_pivot = pivot_iso.transform
if camera_iso: array_camere.append(camera_iso)
if camera_frontale: array_camere.append(camera_frontale)
if camera_laterale: array_camere.append(camera_laterale)
if camera_laterale_2: array_camere.append(camera_laterale_2)
if camera_alta: array_camere.append(camera_alta)
# All'inizio, assicuriamoci che la CameraIso sia quella attiva
if camera_iso:
camera_iso.make_current()
func _input(event):
# Cambio Camera Manuale e Cinematic Toggle
if event is InputEventKey and event.pressed and not event.echo:
# --- TASTO R: RESET DELLA CAMERA ISOMETRICA ---
if event.keycode == KEY_R and is_moving_enabled and pivot_iso:
# Riporta il Pivot al centro esatto sopra il treno
pivot_iso.transform = transform_iniziale_pivot
print("Camera Isometrica resettata!")
return
# --- TASTO C: TOGGLE CINEMATIC MODE ---
if event.keycode == KEY_C:
is_cinematic_mode = !is_cinematic_mode
if is_cinematic_mode:
cinematic_timer = 0.0 # Azzera il timer
# Cerca qual è la camera attualmente attiva per iniziare il ciclo da lì
cinematic_timer = 0.0
for i in range(array_camere.size()):
if array_camere[i].current:
cinematic_index = i
@@ -51,7 +62,7 @@ func _input(event):
print("Cinematic Mode: ATTIVATA")
else:
print("Cinematic Mode: DISATTIVATA")
return # Usciamo per non eseguire altri controlli in questo frame
return
# --- CONTROLLI MANUALI (1-5) ---
var intervento_manuale = false
@@ -81,34 +92,28 @@ func _input(event):
is_moving_enabled = false
intervento_manuale = true
# Se l'utente preme un numero per cambiare camera manualmente, spegni la cinematic mode
if intervento_manuale and is_cinematic_mode:
is_cinematic_mode = false
print("Cinematic Mode: DISATTIVATA (Intervento manuale)")
# Rotazione: Solo se il movimento è abilitato (Camera 1)
if is_moving_enabled:
# --- ROTAZIONE MOUSE (Applicata al PIVOT!) ---
if is_moving_enabled and pivot_iso:
if event is InputEventMouseMotion and Input.is_mouse_button_pressed(MOUSE_BUTTON_RIGHT):
rotate_y(deg_to_rad(-event.relative.x * rotation_speed))
# Ruotando il pivot, la camera farà una bellissima orbita circolare!
pivot_iso.rotate_y(deg_to_rad(-event.relative.x * rotation_speed))
func _process(delta):
# --- LOGICA CINEMATIC MODE ---
if is_cinematic_mode and array_camere.size() > 0:
cinematic_timer += delta
if cinematic_timer >= tempo_cambio_camera:
cinematic_timer = 0.0
# Passa alla camera successiva e se è l'ultima ricomincia da zero
cinematic_index = (cinematic_index + 1) % array_camere.size()
var next_cam = array_camere[cinematic_index]
next_cam.make_current()
# Abilita il movimento WASD solo se la camera inquadrata è quella isometrica (la 1)
is_moving_enabled = (next_cam == camera_iso)
# --- LOGICA DI MOVIMENTO WASD ---
# Se siamo in camera 2, 3, 4 o 5, non processare il movimento WASD
if not is_moving_enabled:
# --- LOGICA DI MOVIMENTO WASD (Applicata al PIVOT!) ---
if not is_moving_enabled or pivot_iso == null:
return
var input_dir = Vector3.ZERO
@@ -119,9 +124,17 @@ func _process(delta):
if input_dir != Vector3.ZERO:
input_dir = input_dir.normalized()
var forward = transform.basis.z
var right = transform.basis.x
# Prendiamo le direzioni dal Pivot, così WASD segue dove stiamo guardando
var forward = pivot_iso.transform.basis.z
var right = pivot_iso.transform.basis.x
forward.y = 0
right.y = 0
var motion = (forward * input_dir.z + right * input_dir.x).normalized()
position += motion * move_speed * delta
forward = forward.normalized()
right = right.normalized()
var motion = (forward * input_dir.z + right * input_dir.x)
# Muoviamo il centro dell'orbita (il Pivot)
pivot_iso.position += motion * move_speed * delta