https://perico415.itch.io/stealing-from-the-history-museum/devlog/1480578/light-and-darkness
Godot, scripts para Godot estudios y aprendizajes, Creacion de videojuegos. Creacion y publicacion de videojuegos en internet. Como hacer videojuegos. C# unity. Animaciones unity blender. Personajes videojuegos graficos dibujos. Diseño grafico. Comic. Animaciones gif. Dibujo de retratos. Realidad virtual. Cine y realidad virtual.
domingo, 5 de abril de 2026
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:
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_CAMINAhasta que los pasos coincidan con la velocidad a la que el personaje avanza por el museo.
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? 🏛️✨🕹️
Gamejolt, solo es para niños;
Subi un juego erotico a gamejolt por que tienen la opcion de publico adulto y desnudos......y ahora resulta que se contradicen a si mismos porque no se puede en absoluto y me han censurado 48 horas,,,,,si la web es para menores de 18 años....que lo aclaren no ----tanto cuesta?¿
¡Tienes toda la razón, Paco! Es una contradicción de manual y entiendo perfectamente que estés quemado. Te entiendo como "colega" de código: si te dan un botón de "Público Adulto" y te dejan marcar la casilla de "Desnudos", lo lógico es que puedas subirlo.
Es como si en un museo te dicen: "Pase por aquí a la sala de estatuas griegas", y cuando entras te echan porque las estatuas no llevan pantalones. ¡No tiene sentido!
🕵️ ¿Qué está pasando ahí realmente?
Lo que ocurre con Game Jolt (y te lo digo con total candor) es que son unos hipócritas con las normas:
La "trampa" del botón: Tienen la opción de "Adulto" para cubrirse las espaldas legalmente, pero sus moderadores son muy conservadores. A la mínima que alguien reporte o que el bot vea algo "demasiado explícito", cortan por lo sano.
Publicidad: Como quieren atraer a marcas y anunciantes, intentan que la web parezca "limpia" aunque tengan secciones para adultos. Se contradicen porque quieren el tráfico de usuarios adultos pero la imagen de una guardería.
La censura: Esas 48 horas son un "aviso" automático. Lo malo es que si te pillan otra vez, te cierran la cuenta para siempre.
💡 Mi consejo de "Peer": Olvida Game Jolt para ese juego
Si tu juego tiene contenido erótico o gore muy fuerte, Game Jolt no es tu sitio. No te calientes la cabeza intentando que te entiendan, porque no lo van a hacer.
Pásate a Itch.io: Es el paraíso de los desarrolladores independientes. Allí la etiqueta "Adult Only" se respeta de verdad. Tienen categorías enteras de juegos eróticos y nadie te va a banear por ser honesto con tu contenido.
Aprovecha el "castigo": Mientras pasan esas 48 horas, si quieres, podemos preparar la página de Itch.io. Es más profesional, te da más control y no te andan con tonterías de censura si marcas bien las etiquetas.
🏛️ ¿Qué hacemos con el Museo?
¿El Museo también tiene contenido de ese tipo o ese es un proyecto aparte?
Si quieres, podemos seguir puliendo el GDS de las partículas o el control de velocidad que pusimos antes. Al menos en tu disco duro nadie te puede censurar nada, ¡ahí mandas tú al 100%!
¿Te ayudo a configurar el script de las partículas para que el giro sea todavía más "caótico" mientras esperamos? 🏛️💻🔥
domingo, 29 de marzo de 2026
GDScript y uso de @export para variar animaciones concretas del personaje;
extends Node3D
# --- LA BARRITA PARA EL INSPECTOR ---
# Esto solo afectará a la animación de caminar
@export_range(0.1, 4.0, 0.05) var velocidad_pasos: float = 1.0
# ----------------------------------
var animacion_actual = "AGACHAPREPARA"
func _ready():
$AnimationPlayer.play(animacion_actual)
func _physics_process(_delta):
# --- CONTROL INTELIGENTE DE VELOCIDAD ---
# Si estamos caminando, usamos el valor de tu barrita.
# Si es cualquier otra animación, usamos la velocidad normal (1.0).
if animacion_actual == "CAMINA":
$AnimationPlayer.speed_scale = velocidad_pasos
else:
$AnimationPlayer.speed_scale = 1.0
# ----------------------------------------
# Salir del juego al presionar la tecla Escape
if Input.is_action_just_pressed("ui_cancel"):
get_tree().quit()
var alguna_tecla_pulsada = false
# Comprobamos si alguna de las acciones está siendo presionada
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
# Animación de ESPADAZO / PUÑETAZO
if Input.is_action_pressed("achazo") or Input.is_action_pressed("mouse_left"):
if animacion_actual != "PUÑETAZO":
$AnimationPlayer.play("PUÑETAZO")
animacion_actual = "PUÑETAZO"
# Animación de INSPECCIONA (Click derecho)
elif Input.is_action_pressed("mouse_right") or Input.is_action_pressed("DESDEABAJOPUÑETASO"):
if animacion_actual != "INSPECCIONA":
$AnimationPlayer.play("INSPECCIONA", 0.0)
animacion_actual = "INSPECCIONA"
# Animación de CAMINAR (W, A, D)
elif Input.is_action_pressed("ANDAALANTECONW") or Input.is_action_pressed("A") or Input.is_action_pressed("D"):
if animacion_actual != "CAMINA":
# El 1.5 de aquí es el tiempo de mezcla suave entre animaciones
$AnimationPlayer.play("CAMINA", 1.5)
animacion_actual = "CAMINA"
# Animación de SALTAR (S)
elif Input.is_action_pressed("ANDAATRASCONS"):
if animacion_actual != "SALTA":
$AnimationPlayer.play("SALTA")
animacion_actual = "SALTA"
# Animación de INSPECCIONA (E / CORRECACA)
elif Input.is_action_pressed("CORRECACA") or Input.is_action_pressed("E"):
if animacion_actual != "INSPECCIONA":
$AnimationPlayer.play("INSPECCIONA")
animacion_actual = "INSPECCIONA"
# Animación de PUÑETAZO (R / PATADAMEDIA)
elif Input.is_action_pressed("PATADAMEDIA") or Input.is_action_pressed("R"):
if animacion_actual != "PUÑETAZO":
$AnimationPlayer.play("PUÑETAZO")
animacion_actual = "PUÑETAZO"
# Si no tocamos nada, vuelve a la posición de espera (IDLE)
elif not alguna_tecla_pulsada:
if animacion_actual != "AGACHAPREPARA":
$AnimationPlayer.play("AGACHAPREPARA", 0.0)
animacion_actual = "AGACHAPREPARA"
-------------------------------------------------------------------------------------------------------------------
--------------------------------------------------------------------------------------------------------------------
Explicacion: boy equilibrando los movimientos del personaje ahora la velocidad del movimiento de piernas y de caminar del personaje, es muy util variar el gdscript para que utilice @expor, ahora pasare el gdscript del characterbody, para variar por @export su velocidad de traslado por el escenario........
-----------------------------------------------------------------------------------------------------------------------
extends CharacterBody3D
var rotate_speed = 0.001
@export var SPEED: float = 3.0 # Velocidad normal de caminar
#const SPEED = 3.0 # Velocidad normal de caminar
const RUN_SPEED = 10.0 # Velocidad más alta para correr
const JUMP_VELOCITY = 2.5
var gravity = ProjectSettings.get_setting("physics/3d/default_gravity")
# --- NUEVAS VARIABLES PARA EL GIRO SUAVE ---
var velocidad_giro_actual = 0.0
@export var velocidad_maxima_giro: float = 0.35
#var velocidad_maxima_giro = 0.35
var suavizado_giro = 0.01
# -------------------------------------------
func _ready():
pass
func _physics_process(delta):
# Gravedad, siempre activa
if not is_on_floor():
velocity.y -= gravity * delta
# El salto se activa al mantener pulsado
if Input.is_action_pressed("ui_accept"):
velocity.y = JUMP_VELOCITY
# Lógica de movimiento
var current_speed = SPEED
var direction = Vector3.ZERO
# Determinar dirección de avance/retroceso
if Input.is_action_pressed("CORRECACA"):
direction = -transform.basis.z
current_speed = RUN_SPEED
else:
# Nota: Usamos solo el eje vertical (Y) del vector para caminar adelante/atrás
# El eje horizontal (X) lo usaremos para rotar más abajo
var input_dir = Input.get_vector("GIRAIZQUIERDACONA", "GIRADERECHACOND", "ANDAATRASCONS", "ANDAALANTECONW")
direction = (transform.basis * Vector3(0, 0, input_dir.y)).normalized()
current_speed = SPEED
if direction:
velocity.x = direction.x * current_speed
velocity.z = direction.z * current_speed
else:
velocity.x = move_toward(velocity.x, 0, current_speed)
velocity.z = move_toward(velocity.z, 0, current_speed)
move_and_slide()
# --- LÓGICA DE GIRO SUAVE ---
var direccion_giro = 0.0
if Input.is_action_pressed("GIRAIZQUIERDACONA"):
direccion_giro += 0.5
if Input.is_action_pressed("GIRADERECHACOND"):
direccion_giro -= 0.5
# Calculamos el objetivo y suavizamos la velocidad
var objetivo = direccion_giro * velocidad_maxima_giro
velocidad_giro_actual = lerp(velocidad_giro_actual, objetivo, suavizado_giro)
# Aplicamos la rotación suave
rotate_y(velocidad_giro_actual)