domingo, 20 de julio de 2025

Borrar por tiempo y animar , sin temporizador,GDScript Godot 4.4;

 extends Node3D


@export var tiempo_para_borrar: float = 5.0 # Tiempo en segundos antes de que el nodo se borre


func _ready() -> void:

$AnimationPlayer.play("mixamo_com")

# Creamos un nuevo nodo Timer

var temporizador = Timer.new()

add_child(temporizador) # Añadimos el temporizador como hijo

temporizador.wait_time = tiempo_para_borrar # Establecemos el tiempo de espera

temporizador.one_shot = true # Aseguramos que el temporizador se ejecute solo una vez

temporizador.start() # Iniciamos el temporizador

# Esperamos a que el temporizador termine

await temporizador.timeout

# Una vez que el temporizador ha terminado, borramos el nodo

queue_free()

jueves, 17 de julio de 2025

GDScript Godot 4.4 abrir puertas en eje "x" de lado a alado no en eje "y" de arriba abajo;

 extends Area3D


@export var velocidad_subida: float = 3.3

@export var velocidad_bajada: float = 3.3  # Cambié el nombre para mayor claridad

@export var altura_maxima: float = 1.0  # Altura máxima que subirá el objeto

@export var altura_inicial: float = 0.0 # Altura inicial del objeto


var objeto: Node3D  # Variable para almacenar el nodo CSGBox3D7

var subiendo: bool = false

var bajando: bool = false

var altura_actual: float = 0.0


@onready var sonido_puerta = $AudioStreamPlayer3D # ¡Añade esta línea! Asegúrate de que el nodo AudioStreamPlayer3D se llame 'AudioStreamPlayer3D' o ajusta el nombre si lo cambiaste.


func _ready():

#objeto = $CSGBox3D7  # Asignamos el nodo a la variable

objeto = $"CSGBox3D6 PUERTACARCEL"  # Asignamos el nodo a la variable

altura_actual = objeto.position.x # Obtiene la altura inicial del objeto

altura_inicial = altura_actual # guarda la altura inicial


func _physics_process(delta):

if objeto:  # Verifica si el objeto existe

if subiendo:

altura_actual += velocidad_subida * delta

altura_actual = min(altura_actual, altura_inicial + altura_maxima) # Limita la altura máxima

objeto.position.x = altura_actual

if altura_actual >= altura_inicial + altura_maxima:

subiendo = false  # Detiene la subida al alcanzar la altura máxima

elif bajando:

altura_actual -= velocidad_bajada * delta

altura_actual = max(altura_actual, altura_inicial)  # Limita la altura mínima

objeto.position.x = altura_actual

if altura_actual <= altura_inicial:

bajando = false  # Detiene la bajada al alcanzar la altura inicial


func _on_area_entered(area: Area3D) -> void:

subiendo = true

bajando = false

# ¡Añade esta línea para reproducir el sonido!

if sonido_puerta and not sonido_puerta.playing: # Verifica que el nodo existe y no está sonando ya

sonido_puerta.play()


func _on_area_exited(area: Area3D) -> void:

subiendo = false

bajando = true

# Puedes añadir un sonido diferente para cuando la puerta baja aquí si lo deseas

# Por ejemplo:

# if sonido_puerta and sonido_puerta.playing: # O puedes usar otro AudioStreamPlayer3D para el sonido de bajada

#     sonido_puerta.stop() # Detiene el sonido si aún está sonando al salir

domingo, 13 de julio de 2025

Un MeshInstance3D gira con alternancias sobre si mismo, GDScript para Godot 4.4;

 extends MeshInstance3D


@export var rotation_speed_min := 0.5

@export var rotation_speed_max := 2.0

@export var rotation_change_interval := 2.0


var current_rotation_speed := 0.0

var time_since_last_change := 0.0

var current_axis := Vector3.ZERO


func _ready():

_set_new_rotation_parameters()


func _process(delta):

time_since_last_change += delta

if time_since_last_change >= rotation_change_interval:

_set_new_rotation_parameters()

time_since_last_change = 0.0


# Apply rotation

rotate_object_local(current_axis, current_rotation_speed * delta)


func _set_new_rotation_parameters():

# Randomize rotation speed

current_rotation_speed = randf_range(rotation_speed_min, rotation_speed_max)


# Randomize rotation axis

var random_x = randf_range(-1.0, 1.0)

var random_y = randf_range(-1.0, 1.0)

var random_z = randf_range(-1.0, 1.0)

current_axis = Vector3(random_x, random_y, random_z).normalized()

Conclusiones sobre aprovechar animaciones de mixamo para proyectos para Godot 4.4.;

 

Conclusiones sobre aprovechar animaciones de mixamo para proyectos para Godot 4.4.


1- Hay que cambiar el cuerpo que usa mixamo, el que tiene mixamo pegado al esqueleto de sus animaciones.


2- Desde Blender hay que borrar el cuerpo que viene pegado a los huesos, el que nos viene desde mixamo, luego hay que importar un cuerpo nuevo, en mi caso desde makehuman, mas adelante puede retocarse modelarse con blender,


3-El esqueleto no encajara en el nuevo cuerpo, a mi me da buen resultado deformar los huesos y adaptarlos al nuevo cuerpo, funciona, luego hay que fusionar ese esqueleto al cuerpo nuevo echo por nosotros.


4- Las animaciones me causaron problemas de que se meten dentro del cuerpo del personaje de forma extraña, no hay problema¡¡¡


5-El personaje echo por nosotros y fusionado con el esqueleto que nosotros emos retocado su tamaño para que encaje con el nuevo modelo , lo volvemos a subir a mixamo, desde mixamo lo retocamos con la opccion Character Arm-Space que hace que los huesos en movimiento se separen del cuerpo de forma controlada y ya esta¡¡¡


6- Descargamos de mixamo nuestro modelo trabajado por nosotros y manipulado por mixamo y todo fantástico¡¡¡¡ resuelto¡¡¡¡



miércoles, 9 de julio de 2025

Sobre el esfuerzo de desarrollar videojuegos¡¡¡¡¡¡¡............;

 Sobre el esfuerzo de desarrollar videojuegos¡¡¡¡¡¡¡............;

Es laborioso, realmente es todo trabajo, no es jugar, bueno, tambien es jugar, pero que detras hay esfuerzo,, no sale solo.


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

OPINION DE LA IA:




¡Así es, lo has captado perfectamente! Lo que describes es la esencia del desarrollo de videojuegos. A menudo, la gente ve el resultado final, el juego funcionando, y no se da cuenta de todo el esfuerzo, la paciencia y el trabajo que hay detrás.


La Dualidad del Desarrollo: Trabajo y Juego

Es una mezcla fascinante de:

  • Trabajo intenso: Horas de código, depuración, ajuste de números, diseño, pruebas y sí, esos momentos de "prueba y error" que mencionabas con el colisionador. Es un proceso metódico que requiere disciplina y perseverancia.

  • Creatividad y juego: Pero a la vez, es un tipo de trabajo que te permite ser increíblemente creativo. Cada ajuste que haces, cada problema que resuelves para que algo "se sienta bien", es una pequeña victoria que alimenta esa chispa. Es "jugar" en el sentido de experimentar, de dar forma a una idea, de ver cómo algo que solo existía en tu mente cobra vida.

Es como construir un castillo de arena: parece un juego, pero requiere saber cuándo añadir agua, cuándo compactar, cómo dar forma para que no se caiga. No sale solo; hay un esfuerzo consciente en cada paso.

Tu experiencia resalta lo gratificante que es cuando, después de todo ese trabajo, logras que el sonido, la animación y la interacción se sincronicen perfectamente. ¡Esa sensación de "lo he conseguido" es el verdadero premio!

martes, 8 de julio de 2025

Instancia y noquea por desgaste lentamente para Godot 4.4. en GDScript;

 extends Area3D


var score = 30

@onready var mesh_instance_3d = $"MeshInstance3D CORAZON"

@onready var sprite_rojo = $Sprite2D

@onready var label_resta = $Label

@onready var mesh_instance_3d1 = $CorazonEncojo

@onready var AudioStreamPlayer3DGOLPE = $AudioStreamPlayer3DGOLPE


# Pre-carga la escena del personaje abatido.

# ¡IMPORTANTE!: Asegúrate de que esta ruta sea correcta en tu proyecto.

const CHAS_ABATIDO_SCENE = preload("res://POLICIA LIMPIO-3- AMPLIO ANIMACIONES/POLICIA  NOKEADO SUSTITUYE AL KIETO.tscn")


func _ready():

actualizar_visualizacion()


func _on_area_entered(area: Area3D) -> void:

$AudioStreamPlayer3DGOLPE.play()


# Evita que el área colisione consigo misma si está configurada así.

if area == self:

return


score -= 1

actualizar_visualizacion()


func actualizar_visualizacion():

label_resta.text = str(score)

var escala = float(score) / 30.0

sprite_rojo.scale = Vector2(escala, escala)

mesh_instance_3d.scale = Vector3(escala, escala, escala)

mesh_instance_3d1.scale = Vector3(escala, escala, escala)


if score <= 0:

# Oculta los componentes visuales del corazón

sprite_rojo.visible = false

mesh_instance_3d.visible = false

mesh_instance_3d1.visible = false

label_resta.visible = false


# Guarda la posición global actual del Area3D antes de eliminarlo

var current_global_transform = global_transform


# Elimina la propia Area3D que contiene este script

queue_free()

print("La Area3D del corazón ha sido eliminada al llegar a 0.")


# Instancia la escena del personaje abatido

if CHAS_ABATIDO_SCENE != null:

var chas_abatido_instance = CHAS_ABATIDO_SCENE.instantiate()


# Asegúrate de que la instancia se creó correctamente

if is_instance_valid(chas_abatido_instance):

# Establece la posición global de la nueva instancia a la del Area3D eliminado

chas_abatido_instance.global_transform = current_global_transform


# Añade la nueva instancia a la escena.

# Lo ideal es añadirla al mismo padre que tenía el Area3D del corazón.

# Si no hay padre o es inválido, se añade a la raíz del árbol.

get_tree().get_root().add_child(chas_abatido_instance)

print("Instanciado CHASABATIDO-1-.tscn en la posición del corazón eliminado.")

else:

print("ERROR: No se pudo instanciar CHASABATIDO-1-.tscn. La escena podría estar corrupta.")

else:

print("ERROR: CHASABATIDO-1-.tscn no se pudo pre-cargar. Revisa la ruta.")



func _on_timer_timeout() -> void:

pass


func _on_area_exited(area: Area3D) -> void:

pass

domingo, 6 de julio de 2025

GDScript para Godot 4.4. encoje corazon como barra de vida y cambia la escena; tambien provoca un sonido de golpe...;

 extends Area3D


var score = 30

#@onready var mesh_instance_3d = $"../../CharacterBody3D/CollisionShape3D/PROTAGONISTA EXPLORADORA VARIOS MOVIMIENTOS ANDAR CORRER GRITAR_/MeshInstance3D2 PRUEBAS DE CORAZON"

@onready var mesh_instance_3d = $"MeshInstance3D CORAZON"

#@onready var sprite_rojo = $"Sprite2D rojo"

@onready var sprite_rojo = $Sprite2D

#@onready var label_resta = $"Label resta"

@onready var label_resta = $Label


@onready var mesh_instance_3d1 = $CorazonEncojo



@onready var AudioStreamPlayer3DGOLPE = $AudioStreamPlayer3DGOLPE



func _ready():

actualizar_visualizacion()


func _on_area_entered(area: Area3D) -> void:

$AudioStreamPlayer3DGOLPE.play()

if area.is_ancestor_of(self): #evita que se active el trigger con el mismo objeto que contiene el script

return

#$AudioStreamPlayer3D.play() #si lo quieres activar descomentalo

score -= 1

actualizar_visualizacion()


if score < 0:

get_tree().change_scene_to_file("res://PRESO LOCOCACHASGRANDE/CHASABATIDO-1-.tscn")


func actualizar_visualizacion():

label_resta.text = str(score)

var escala = float(score) / 30.0

sprite_rojo.scale = Vector2(escala, escala)

mesh_instance_3d.scale = Vector3(escala, escala, escala) #se corrige para que trabaje en 3D

mesh_instance_3d1.scale = Vector3(escala, escala, escala) #se corrige para que trabaje en 3D

if score <= 0:

sprite_rojo.visible = false

mesh_instance_3d.visible = false


func _on_timer_timeout() -> void:

pass



func _on_area_exited(area: Area3D) -> void:

pass # Replace with function body.


-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------EXPLICACION:  GDScript para Godot 4.4. encoje corazon como barra de vida y cambia la escena; tambien provoca un sonido de golpe...; ES EL PRIMER GDSCRIPT EL CUAL LO RAZONO, Y LE AÑADO LAS LINEAS DE CODIGO NECESARIAS PARA PRODUCIR UN SONIDO CUANDO ALGO ENTRA EN ESE AREA......GOLPES¡¡¡¡