extends Area3D
@export_category("Control de Interfaz")
# Arrastra aquí tu nodo HSlider desde el Inspector
@export var slider_control: HSlider
@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
# Calibramos el HSlider por código para que coincida con tus distancias
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 # Empieza en el centro
# Conectamos la señal para cuando el usuario arrastre la bolita con el ratón
slider_control.value_changed.connect(_on_slider_value_changed)
else:
push_warning("¡Aviso! No has arrastrado el HSlider al Inspector del Area3D.")
func _process(delta: float) -> void:
var direccion: float = 0.0
# 1. Detectamos las flechas del teclado
if Input.is_action_pressed("ui_right"):
direccion += 1.0
if Input.is_action_pressed("ui_left"):
direccion -= 1.0
# 2. Si el jugador está pulsando las flechas, movemos el objeto
if direccion != 0.0:
position.z += direccion * velocidad_movimiento * delta
# Limitamos el movimiento dentro de los márgenes seguros
position.z = clamp(position.z, posicion_inicial_z - distancia_maxima, posicion_inicial_z + distancia_maxima)
# ¡Sincronización! Actualizamos la posición de la bolita del slider en pantalla
if slider_control:
# Desconectamos temporalmente la señal para evitar un bucle infinito al actualizar el valor
slider_control.value_changed.disconnect(_on_slider_value_changed)
# Calculamos el desvío actual respecto al centro y se lo asignamos al slider
slider_control.value = position.z - posicion_inicial_z
# Volvemos a conectar la señal para el ratón
slider_control.value_changed.connect(_on_slider_value_changed)
# 3. Esta función se ejecuta automáticamente cuando arrastras la bolita con el ratón
func _on_slider_value_changed(nuevo_valor: float) -> void:
# Modificamos la Z del objeto directamente usando el valor del slider
position.z = posicion_inicial_z + nuevo_valor