extends Area3D
@export_category("Control de Interfaz")
# Arrastra aquí tu nodo HSlider desde el Inspector
@export var slider_control: HSlider
# Arrastra aquí tu nodo Label2 (el del texto grande de victoria)
@export var mensaje_victoria: Label
# Arrastra aquí tu nodo Label3 (el del texto grande de derrota/game over)
@export var mensaje_derrota: Label
@export_category("Eliminar Suelo al Ganar")
# Arrastra aquí el Area3DSuelo desde el árbol de escenas para borrarlo al ganar
@export var area_suelo_a_borrar: Area3D
@export_category("Configuración del Retraso")
# ¿Quieres que el texto tarde un poco en aparecer? Actívalo o desactívalo
@export var usar_retraso: bool = true
# Tiempo de espera en segundos antes de mostrar el cartel de victoria
@export var tiempo_espera_segundos: float = 2.0
@export_category("Movimiento Lateral")
# Velocidad a la que se desplaza con las flechas en el eje Z
@export var velocidad_movimiento: float = 5.0
# Distancia máxima (en metros) que se puede alejar de su centro en Z
@export var distancia_maxima: float = 3.0
# Variable para recordar la posición Z inicial configurada en el editor
var posicion_inicial_z: float = 0.0
func _ready() -> void:
# Guardamos el valor de Z del editor al arrancar
posicion_inicial_z = position.z
# Nos aseguramos de que los textos empiecen OCULTOS al iniciar la partida
if mensaje_victoria:
mensaje_victoria.visible = false
else:
push_warning("¡Aviso! No has arrastrado el Label de victoria al script de la colchoneta.")
if mensaje_derrota:
mensaje_derrota.visible = false
# Conectamos la señal para detectar cuándo entra un cuerpo (el suicida) en el área
body_entered.connect(_on_body_entered)
# Calibramos el HSlider por código
if slider_control:
slider_control.min_value = -distancia_maxima
slider_control.max_value = distancia_maxima
slider_control.step = 0.01
slider_control.value = 0.0
slider_control.value_changed.connect(_on_slider_value_changed)
func _process(delta: float) -> void:
var direccion: float = 0.0
if Input.is_action_pressed("ui_right"):
direccion += 1.0
if Input.is_action_pressed("ui_left"):
direccion -= 1.0
if direccion != 0.0:
position.z += direccion * velocidad_movimiento * delta
position.z = clamp(position.z, posicion_inicial_z - distancia_maxima, posicion_inicial_z + distancia_maxima)
if slider_control:
slider_control.value_changed.disconnect(_on_slider_value_changed)
slider_control.value = position.z - posicion_inicial_z
slider_control.value_changed.connect(_on_slider_value_changed)
func _on_slider_value_changed(nuevo_valor: float) -> void:
position.z = posicion_inicial_z + nuevo_valor
# Esta función se activa SOLA cuando el personaje toca la colchoneta
func _on_body_entered(body: Node3D) -> void:
print("¡Salvado! Ha entrado: ", body.name)
# Si has arrastrado el suelo al Inspector, lo borramos de la memoria INMEDIATAMENTE
if area_suelo_a_borrar:
print("Borrando el Area3DSuelo para evitar la derrota...")
area_suelo_a_borrar.queue_free()
# Aseguramos que el cartel de derrota desaparezca o se mantenga oculto
if mensaje_derrota:
mensaje_derrota.visible = false
# Comprobamos si tenemos activo el retraso en el Inspector
if usar_retraso:
await get_tree().create_timer(tiempo_espera_segundos).timeout
# Se muestra el cartel de victoria
if mensaje_victoria:
mensaje_victoria.visible = true
No hay comentarios:
Publicar un comentario