domingo, 12 de abril de 2026

Aplicando @export para graduar tiempo desde el inspector; tiempo que dura una explosion; Godot 4.6.2;

 extends Node3D

# Tiempo en segundos antes de autodestruirse

@export var self_destruct_time: float = 15.0

#var self_destruct_time = 2.0


var elapsed_time = 0.0




func _process(delta: float) -> void:


elapsed_time += delta



if elapsed_time >= self_destruct_time:


queue_free()


lunes, 6 de abril de 2026

Godot 4.6.2 GDScript muy elavorado para proyectil;

 extends Area3D


# --- AJUSTES DESDE EL INSPECTOR ---

@export_group("Movimiento")

@export var velocidad: float = 15.0

@export var gravedad: float = 9.8  # Fuerza con la que cae al chocar

@export var rebote_fuerza: float = 0.2 # Un pequeño saltito al tocar la pared


@export_group("Tiempos de Vida")

@export var tiempo_vuelo_max: float = 5.0 # Se borra si no toca nada en X segundos

@export var tiempo_en_suelo: float = 3.0 # Cuánto tiempo se queda tirada en el suelo antes de borrarse


# --- VARIABLES INTERNAS ---

var chocado: bool = false

var velocidad_caida: Vector3 = Vector3.ZERO

var tiempo_total: float = 0.0


func _ready() -> void:

if not body_entered.is_connected(_on_body_entered):

body_entered.connect(_on_body_entered)


func _process(delta: float) -> void:

tiempo_total += delta

if not chocado:

# --- ESTADO 1: VOLANDO ---

# Avanza recto hacia adelante

translate(Vector3(0, 0, velocidad * delta))

# Autodestrucción por seguridad (si se pierde en el infinito)

if tiempo_total >= tiempo_vuelo_max:

queue_free()

else:

# --- ESTADO 2: CAYENDO (FÍSICA SIMULADA) ---

# Aplicamos gravedad a la velocidad de caída

velocidad_caida.y -= gravedad * delta

position += velocidad_caida * delta

# Si lleva mucho tiempo en el suelo, la borramos para ahorrar memoria

if tiempo_total >= tiempo_en_suelo:

queue_free()


func _on_body_entered(body: Node) -> void:

if chocado: return # Si ya chocó, no procesamos más choques

print("¡Impacto con: ", body.name, "! Cayendo al suelo...")

chocado = true

tiempo_total = 0.0 # Reiniciamos el cronómetro para el tiempo en el suelo

# Calculamos un pequeño rebote aleatorio para que no caiga como un palo

velocidad_caida = Vector3(

randf_range(-1, 1), 

rebote_fuerza, 

randf_range(-1, 1)

)

# Opcional: Podrías desactivar el sonido o la luz de la bala aquí

---------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------


Explicacion: este GDScript regula desde el inspector, velocidad de los proyectiles, tiempo de vida en pantalla de ellos, gravedad ,revote.....virgerias vamos todo gracias a la IA  de mi navegador de internet.


domingo, 5 de abril de 2026

Stealing from the history museum. » Devlog;

 https://perico415.itch.io/stealing-from-the-history-museum/devlog/1480578/light-and-darkness





Crear fogonazo de disparos en Godot 4.6; uso de @export en el GDScript para calibrar desde el inspector;

 extends Area3D


var Bullet = preload("res://ELEMENTOS QUE EXPLOTAN/HMOPISTOLA.tscn")


# --- CONTROL DESDE EL INSPECTOR ---

# Si pones 0.5, disparará cada medio segundo. 

# Si pones 0.1, ¡será una metralleta!

@export_range(0.05, 2.0, 0.05) var cadencia_disparo: float = 0.5


# --- Variables internas ---

var can_fire_right_mouse: bool = true

var player_mesh: MeshInstance3D


func _ready() -> void:

# Configuramos el temporizador

var timer = Timer.new()

add_child(timer)

timer.wait_time = cadencia_disparo

timer.one_shot = true

# Cuando el tiempo termina, permitimos disparar otra vez

timer.timeout.connect(func(): can_fire_right_mouse = true)

# Guardamos la referencia para usarla en el proceso

self.set_meta("disparo_timer", timer)


func _process(delta: float) -> void:

# --- LÓGICA DE DISPARO AUTOMÁTICO ---

# Comprobamos CADA FRAME si el botón derecho está pulsado

if Input.is_mouse_button_pressed(MOUSE_BUTTON_RIGHT):

if can_fire_right_mouse:

can_fire_right_mouse = false

instantiate_bullet()

# Accedemos al timer y lo arrancamos con el tiempo del @export

var timer = self.get_meta("disparo_timer")

timer.wait_time = cadencia_disparo

timer.start()


# --- LÓGICA de rotación (Se mantiene igual) ---

if player_mesh:

if Input.is_key_pressed(KEY_Z):

player_mesh.rotate_object_local(Vector3.FORWARD, 1.0 * delta)

if Input.is_key_pressed(KEY_X):

player_mesh.rotate_object_local(Vector3.FORWARD, -1.0 * delta)


func instantiate_bullet() -> void:

var bullet = Bullet.instantiate()

add_child(bullet)



Una opcion de sistema de disparos para Godot 4.6; GDScript; y uso de @export desde el GDScript;

 extends Area3D


var Bullet = preload("res://PROTAGONISTA/area_3dPROLLECTIL RIFLE.tscn")


# --- CONTROL DESDE EL INSPECTOR ---

# Si pones 0.5, disparará cada medio segundo. 

# Si pones 0.1, ¡será una metralleta!

@export_range(0.05, 2.0, 0.05) var cadencia_disparo: float = 0.5


# --- Variables internas ---

var can_fire_right_mouse: bool = true

var player_mesh: MeshInstance3D


func _ready() -> void:

# Configuramos el temporizador

var timer = Timer.new()

add_child(timer)

timer.wait_time = cadencia_disparo

timer.one_shot = true

# Cuando el tiempo termina, permitimos disparar otra vez

timer.timeout.connect(func(): can_fire_right_mouse = true)

# Guardamos la referencia para usarla en el proceso

self.set_meta("disparo_timer", timer)


func _process(delta: float) -> void:

# --- LÓGICA DE DISPARO AUTOMÁTICO ---

# Comprobamos CADA FRAME si el botón derecho está pulsado

if Input.is_mouse_button_pressed(MOUSE_BUTTON_RIGHT):

if can_fire_right_mouse:

can_fire_right_mouse = false

instantiate_bullet()

# Accedemos al timer y lo arrancamos con el tiempo del @export

var timer = self.get_meta("disparo_timer")

timer.wait_time = cadencia_disparo

timer.start()


# --- LÓGICA de rotación (Se mantiene igual) ---

if player_mesh:

if Input.is_key_pressed(KEY_Z):

player_mesh.rotate_object_local(Vector3.FORWARD, 1.0 * delta)

if Input.is_key_pressed(KEY_X):

player_mesh.rotate_object_local(Vector3.FORWARD, -1.0 * delta)


func instantiate_bullet() -> void:

var bullet = Bullet.instantiate()

add_child(bullet)






GDScript para Godot 4.6; hace una barra que manipula la cantidad de luz;

 

extends Node


@export var mi_luz : Light3D 

@export var velocidad_teclas : float = 50.0 # Cuánto de rápido sube/baja la luz


# Buscamos al HSlider que es hijo (ajusta la ruta si cambia)

@onready var barra_luz = $CanvasLayer/HSlider 


func _ready() -> void:

# Configuramos la barra al arrancar

if barra_luz and mi_luz:

barra_luz.min_value = 0.0

barra_luz.max_value = 50.0

barra_luz.step = 0.1

barra_luz.value = mi_luz.light_energy


func _process(delta: float) -> void:

if not barra_luz or not mi_luz:

return


# --- CONTROL POR TECLAS ---

# Si pulsas 'P', el valor de la barra sube

if Input.is_key_pressed(KEY_P):

barra_luz.value += velocidad_teclas * delta

# Si pulsas 'O', el valor de la barra baja

if Input.is_key_pressed(KEY_O):

barra_luz.value -= velocidad_teclas * delta


# --- VINCULACIÓN ---

# La luz siempre sigue lo que diga la barra (ya sea por teclas o ratón)

mi_luz.light_energy = barra_luz.value


--------------------------------------------------------------------------------------------------------------------

--------------------------------------------------------------------------------------------------------------------

Explicacion: Mi juego del museo es un juego oscuro de misterio; hice una barra que desliza presionando teclas -o- y -p- la cantidad de luz ambiente preferidad por el jugador, de alguna manera altera la facilidad o dificultad del juego tambien,-o- oscuro -p- luz, gradualmente, la verdad queda genial, se arrastra desde la escena al inspector el nodo de luz que deseemos alterar., todo ayudandome desde la IA del navegador ; Google Gemini menuda IA, ahora me resulta imprescindible para desarrollar los juegos.




lunes, 30 de marzo de 2026

Afinando animacion de personaje con GDScript y aprovechando el inspector y el @export, con todas las animaciones;

 extends Node3D


# --- GRUPO 1: VELOCIDADES (Qué tan rápido se mueve el personaje) ---

@export_group("Velocidades de Animación")

@export_range(0.1, 4.0, 0.05) var vel_CAMINA: float = 1.0

@export_range(0.1, 4.0, 0.05) var vel_PUÑETAZO: float = 1.0

@export_range(0.1, 4.0, 0.05) var vel_INSPECCIONA: float = 1.0

@export_range(0.1, 4.0, 0.05) var vel_SALTA: float = 1.0

@export_range(0.1, 4.0, 0.05) var vel_AGACHAPREPARA: float = 1.0  # <--- YA LO TIENES CON SU NOMBRE


# --- GRUPO 2: SUAVIDAD (Qué tan rápido cambia de una a otra) ---

@export_group("Suavidad de Transición")

@export_range(0.0, 2.0, 0.1) var suave_AGACHAPREPARA: float = 0.5 # <--- PARA EVITAR EL TIRÓN

@export_range(0.0, 2.0, 0.1) var suave_al_andar: float = 1.5

@export_range(0.1, 2.0, 0.1) var suave_ataques: float = 0.3

# ------------------------------------------------------


var animacion_actual = "AGACHAPREPARA"


func _ready():

$AnimationPlayer.play(animacion_actual)


func _physics_process(_delta):

# --- CONTROL DE VELOCIDAD POR ANIMACIÓN ---

match animacion_actual:

"CAMINA":

$AnimationPlayer.speed_scale = vel_CAMINA

"PUÑETAZO":

$AnimationPlayer.speed_scale = vel_PUÑETAZO

"INSPECCIONA":

$AnimationPlayer.speed_scale = vel_INSPECCIONA

"SALTA":

$AnimationPlayer.speed_scale = vel_SALTA

"AGACHAPREPARA":

$AnimationPlayer.speed_scale = vel_AGACHAPREPARA

# ------------------------------------------


# Salir del juego

if Input.is_action_just_pressed("ui_cancel"):

get_tree().quit()

var alguna_tecla_pulsada = false

# Comprobación de todas tus acciones

if Input.is_action_pressed("achazo") or \

   Input.is_action_pressed("mouse_left") or \

   Input.is_action_pressed("mouse_right") or \

   Input.is_action_pressed("DESDEABAJOPUÑETASO") or \

   Input.is_action_pressed("ANDAALANTECONW") or \

   Input.is_action_pressed("ANDAATRASCONS") or \

   Input.is_action_pressed("CORRECACA") or \

   Input.is_action_pressed("ui_accept") or \

   Input.is_action_pressed("PATADAMEDIA") or \

   Input.is_action_pressed("A") or \

   Input.is_action_pressed("D"):

alguna_tecla_pulsada = true


# Ataque / Puñetazo

if Input.is_action_pressed("achazo") or Input.is_action_pressed("mouse_left"):

if animacion_actual != "PUÑETAZO":

$AnimationPlayer.play("PUÑETAZO", suave_ataques)

animacion_actual = "PUÑETAZO"


# Inspección (Click Derecho)

elif Input.is_action_pressed("mouse_right") or Input.is_action_pressed("DESDEABAJOPUÑETASO"):

if animacion_actual != "INSPECCIONA":

$AnimationPlayer.play("INSPECCIONA", suave_ataques)

animacion_actual = "INSPECCIONA"


# Caminar

elif Input.is_action_pressed("ANDAALANTECONW") or Input.is_action_pressed("A") or Input.is_action_pressed("D"):

if animacion_actual != "CAMINA":

$AnimationPlayer.play("CAMINA", suave_al_andar)

animacion_actual = "CAMINA"

# Saltar

elif Input.is_action_pressed("ANDAATRASCONS"):

if animacion_actual != "SALTA":

$AnimationPlayer.play("SALTA", suave_ataques)

animacion_actual = "SALTA"

# Inspección alternativa (E)

elif Input.is_action_pressed("CORRECACA") or Input.is_action_pressed("E"):

if animacion_actual != "INSPECCIONA":

$AnimationPlayer.play("INSPECCIONA", suave_ataques)

animacion_actual = "INSPECCIONA"

# Patada / Puñetazo alternativo (R)

elif Input.is_action_pressed("PATADAMEDIA") or Input.is_action_pressed("R"):

if animacion_actual != "PUÑETAZO":

$AnimationPlayer.play("PUÑETAZO", suave_ataques)

animacion_actual = "PUÑETAZO"


# --- RETORNO AL REPOSO (IDLE) ---

elif not alguna_tecla_pulsada:

if animacion_actual != "AGACHAPREPARA":

# Aquí usamos la barrita de suavidad específica para que el brazo no pegue saltos

$AnimationPlayer.play("AGACHAPREPARA", suave_AGACHAPREPARA)

animacion_actual = "AGACHAPREPARA"


Explicacion ayudandome siempre de la IA:   me gusta mucho!!! aun queda el movimiento algo extraño pero tengo sensacion de dominio y de poder ajustarlo todo de forma razonable, la perfeccion me puede volver majareta.




Gemini ha dicho

¡Esa es la actitud del desarrollador veterano, Paco! La "parálisis por perfección" es el mayor enemigo de cualquier proyecto. Es mejor tener un sistema que funcione al 90% y que tú puedas controlar, que volverse loco intentando que cada hueso del personaje se mueva como en una película de Hollywood.

Esa "sensación de dominio" que tienes ahora es clave: ya no eres un pasajero del código, ahora eres el piloto.

🕵️ ¿Por qué sigue pareciendo "algo extraño"? (Consejos de "Peer")

Si notas que el movimiento aún tiene un "no sé qué" que no termina de encajar, suele deberse a dos cosas que no son culpa del código, sino de la naturaleza de la animación:

  1. El "Foot Sliding" (Deslizamiento): Si la animación de las piernas va muy rápido pero el personaje se desplaza por el suelo despacio, parece que patina sobre hielo.

    • Solución: Ajusta vel_CAMINA hasta que los pasos coincidan con la velocidad a la que el personaje avanza por el museo.

  2. Corte de Animación: A veces, si pasas de un puñetazo a caminar muy rápido, los brazos pegan un pequeño brinco.

    • Solución: Juega con suave_al_andar. Si lo subes a 1.0 o más, el cambio será tan lento que el ojo no notará el salto.

💡 Un truco final para tu paz mental:

No intentes arreglarlo todo hoy. Lo que hoy te parece "un poco raro", mañana, después de descansar la vista, lo verás mucho más claro. El cerebro se satura de ver al mismo personaje hacer lo mismo mil veces.

Reflexión de "Peer": "Paco, lo que tienes ahora es un sistema de Depuración en Vivo. Muy pocos principiantes se molestan en hacerse estas herramientas. Tú ya tienes el panel de control listo; ahora, cada vez que eches una partida y veas algo raro, mueves la barrita y a seguir creando el museo".


¿Te apetece que lo dejemos aquí por hoy para que lo pruebes con calma, o quieres que le metamos mano a ese script de las partículas que giran para que el museo tenga más atmósfera? 🏛️✨🕹️