martes, 26 de agosto de 2025

instanciando un RigidBody3D con gravedad que cae a los 3 segundos; automaticamente cada 3 segundos;

 extends Area3D


# Carga la escena de la bola para poder instanciarla.

var bola_proyectada_scene = preload("res://PIRATAENCUBETA/PROLLECTILES DE PIRATA EN CUBIERTA/RIGBODIQUECAEarea_3dBOLAPROYECTADA.tscn")


# Variable para contar el tiempo restante para la próxima instancia.

var tiempo_restante: float = 3.0


func _process(delta: float) -> void:

# Resta el tiempo transcurrido (delta) al contador.

tiempo_restante -= delta

# Comprueba si el tiempo ha llegado a cero o menos.

if tiempo_restante <= 0.0:

# Llama a la función para instanciar la bola.

instanciar_bola()

# Reinicia el contador para que el ciclo se repita cada 3 segundos.

tiempo_restante = 3.0


func instanciar_bola() -> void:

# Instancia la escena pre-cargada.

var nueva_bola = bola_proyectada_scene.instantiate()

# Asigna la posición de la nueva instancia a la del nodo actual.

nueva_bola.global_position = self.global_position


# Añade la instancia como hijo del nodo padre.

get_parent().add_child(nueva_bola)

viernes, 22 de agosto de 2025

Cambiar resolucion de pantalla en los juegos de godot 4.4;

extends MultiMeshInstance3D



# Definimos las tres resoluciones.

var resolucion_1: Vector2i = Vector2i(1920, 1080)

var resolucion_2: Vector2i = Vector2i(1280, 720) # He corregido el 12800 a 1280.

var resolucion_3: Vector2i = Vector2i(800, 600)


func _input(event: InputEvent) -> void:

# Si presionas RESOLUCION1, cambia a 1920x1080

if event.is_action_pressed("RESOLUCION1"):

DisplayServer.window_set_size(resolucion_1)

# Opcional: para que se vea en ventana y no en pantalla completa

DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED)


# Si presionas RESOLUCION2, cambia a 1280x720

if event.is_action_pressed("RESOLUCION2"):

DisplayServer.window_set_size(resolucion_2)

DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED)


# Si presionas RESOLUCION3, cambia a 800x600

if event.is_action_pressed("RESOLUCION3"):

DisplayServer.window_set_size(resolucion_3)

DisplayServer.window_set_mode(DisplayServer.WINDOW_MODE_WINDOWED)



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

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

Explicacion: este GDScript cambia la resolucion de pantallas en 3 tamaños, tecla -1- con mapa de entrada llamado "RESOLUCION1" tecla-2- "RESOLUCION2" tecla -3- "RESOLUCION3" resoluciones de  1920x1080  de  1280x720  de  800x600.

miércoles, 20 de agosto de 2025

¡¡Trabajo duro!!;

 Esa es una descripción muy precisa del "trabajo duro" en el desarrollo de videojuegos y en la programación. No es un cansancio físico, sino un agotamiento mental que se deriva de la concentración y la repetición.

Tienes toda la razón, es un trabajo mentalmente agotador:

  • Concentración Intensa: Estar horas concentrado en una pantalla, resolviendo problemas y buscando el origen de los errores, consume muchísima energía mental. Es un tipo de esfuerzo que el cerebro no está acostumbrado a sostener por períodos largos.

  • Tareas Repetitivas y Paciencia: Afinar pequeños detalles, hacer ajustes mínimos en los valores de un script, o simplemente probar y volver a probar algo una y otra vez requiere una paciencia y una disciplina que no todo el mundo tiene.

  • La Lucha contra lo invisible: Con las tareas físicas, ves el progreso: la pared se construye, la zanja se excava. En la programación, a veces trabajas durante horas y no ves un cambio visible hasta que finalmente encuentras ese pequeño error que lo arregla todo.

Ese tipo de trabajo es el que diferencia a un aficionado de un profesional. Esa constancia y esa capacidad para seguir adelante a pesar de la frustración mental es lo que al final se traduce en un producto de calidad. Es un tipo de "músculo" que se entrena con la práctica y la disciplina.

Giros locos de un pez muerto y luego se borra pasados unos segundos;

 extends Node3D


# Velocidad máxima de rotación en radianes por segundo.

# Puedes ajustar este valor en el Inspector para controlar la "locura".

@export var max_rotation_speed: float = 10.0


func _process(delta: float) -> void:

# Genera un valor de rotación aleatorio para cada eje en cada fotograma

var random_x_rotation = (randf() * 2 - 1) * max_rotation_speed

var random_y_rotation = (randf() * 2 - 1) * max_rotation_speed

var random_z_rotation = (randf() * 2 - 1) * max_rotation_speed

# Rota el nodo en los tres ejes usando los valores aleatorios

# 'delta' asegura que la rotación sea suave e independiente de los FPS

rotate_x(random_x_rotation * delta)

rotate_y(random_y_rotation * delta)

rotate_z(random_z_rotation * delta)




func _ready():

# get_tree().create_timer(3.0) crea un temporizador de 3 segundos.

# .timeout.connect(queue_free) conecta la señal 'timeout' del temporizador

# con el método 'queue_free()' de este mismo nodo.

# queue_free() borra el nodo de forma segura.

get_tree().create_timer(4.8).timeout.connect(queue_free)

Instancia 4 elementos funciona en godot 4.4;

 extends Area3D


var Esferauno = preload("res://BARCO ELEMENTOS TEXTURAS/CAÑONES/TIBURON REVENTAO-3-.tscn")

var Esferauno1 = preload("res://BARCO ELEMENTOS TEXTURAS/CAÑONES/TIBURON REVENTAO-3-.tscn")

var Esferauno2 = preload("res://BARCO ELEMENTOS TEXTURAS/AGUA/mesh_instance_3d_salpicadurasDEL TIBURON MUERTO.tscn")

var Esferauno3 = preload("res://BARCO ELEMENTOS TEXTURAS/TIBURON/ACUARIUM/TIBURON/TIBURONSERETUERCEMUERTO-.tscn")




func _ready() -> void:

$AnimationPlayer.play("TIBURONDESDEAREAMUEVO")

pass


func _process(delta: float) -> void:

pass


func _on_area_entered(area: Area3D) -> void:

var parent = get_parent() # Obtiene una referencia al nodo padre


if parent and parent is CharacterBody3D:

var parent_global_transform = parent.global_transform # Guarda la transformación global del padre


# Instancia la escena de "POLICIA NOKEADO"

var policia_nokeado_instancia = Esferauno.instantiate()

get_tree().root.add_child(policia_nokeado_instancia) # Añade la instancia a la raíz del árbol de escena

policia_nokeado_instancia.global_transform = parent_global_transform # Establece su posición a la del padre borrado


parent.queue_free() # Borra el nodo padre (CharacterBody3D)


var collision_shape_cubo = parent.get_node_or_null("CollisionShape3D")

if collision_shape_cubo:

collision_shape_cubo.queue_free()


get_node("CollisionShape3D").queue_free()


# Si deseas que esta Area3D también se borre, descomenta la siguiente línea

# queue_free()


pass


func _on_area_exited(area: Area3D) -> void:

# Ahora, Esferauno (POLICIA NOKEADO) ya no se instanciará aquí.

# Si Esferauno1 (DIENTES Y SANGRE) debe seguir apareciendo al salir, déjalo aquí.

var Esferauno1_instancia = Esferauno1.instantiate()

add_child(Esferauno1_instancia) # Puedes decidir si quieres que esto sea hijo de esta Area3D o de la raíz.


var Esferauno2_instancia = Esferauno2.instantiate()

add_child(Esferauno2_instancia) # Puedes decidir si quieres que esto sea hijo de esta Area3D o de la raíz.


var Esferauno3_instancia = Esferauno3.instantiate()

add_child(Esferauno3_instancia) # Puedes decidir si quieres que esto sea hijo de esta Area3D o de la raíz.



pass

Giros locos en ejes -y-z-x alternando y a lo loco; simulara un pez cazado;

 extends Node3D


# Velocidad máxima de rotación en radianes por segundo.

# Puedes ajustar este valor en el Inspector para controlar la "locura".

@export var max_rotation_speed: float = 10.0


func _process(delta: float) -> void:

# Genera un valor de rotación aleatorio para cada eje en cada fotograma

var random_x_rotation = (randf() * 2 - 1) * max_rotation_speed

var random_y_rotation = (randf() * 2 - 1) * max_rotation_speed

var random_z_rotation = (randf() * 2 - 1) * max_rotation_speed

# Rota el nodo en los tres ejes usando los valores aleatorios

# 'delta' asegura que la rotación sea suave e independiente de los FPS

rotate_x(random_x_rotation * delta)

rotate_y(random_y_rotation * delta)

rotate_z(random_z_rotation * delta)

Instanciar 3 elementos para simular una caza en el mar, ademas anima un objeto en una simulacion del mar;

 extends Area3D


var Esferauno = preload("res://BARCO ELEMENTOS TEXTURAS/CAÑONES/TIBURON REVENTAO-3-.tscn")

# Nota: "Esferauno1" está precargando la misma escena que "Esferauno".

# Si son escenas diferentes, por favor revisa la ruta.

var Esferauno1 = preload("res://BARCO ELEMENTOS TEXTURAS/CAÑONES/TIBURON REVENTAO-3-.tscn")

var Esferauno2 = preload("res://BARCO ELEMENTOS TEXTURAS/AGUA/mesh_instance_3d_salpicaduras.tscn")


func _ready() -> void:

$AnimationPlayer.play("TIBURONDESDEAREAMUEVO")



func _on_area_entered(area: Area3D) -> void:

var parent = get_parent()


if parent and parent is CharacterBody3D:

var parent_global_transform = parent.global_transform


# Instancia la escena del "POLICIA NOKEADO"

var policia_nokeado_instancia = Esferauno.instantiate()

get_tree().root.add_child(policia_nokeado_instancia)

policia_nokeado_instancia.global_transform = parent_global_transform

# Borra el nodo padre (CharacterBody3D)

parent.queue_free()

# Instancia y añade Esferauno1

var Esferauno1_instancia = Esferauno1.instantiate()

Esferauno1_instancia.global_transform = parent_global_transform

get_tree().root.add_child(Esferauno1_instancia)

# Instancia y añade Esferauno2 (salpicaduras)

var Esferauno2_instancia = Esferauno2.instantiate()

Esferauno2_instancia.global_transform = parent_global_transform

get_tree().root.add_child(Esferauno2_instancia)


# Borra el CollisionShape3D de este nodo

var collision_shape = get_node_or_null("CollisionShape3D")

if collision_shape:

collision_shape.queue_free()


# Borra el propio nodo Area3D para evitar errores futuros

queue_free()

domingo, 17 de agosto de 2025

Me tratan de esquizofrenico¡¡¡¡;

https://evefysh.itch.io/ 

https://itch.io/profile/evefysh

https://perico415.itch.io/mmacabre-and-gothic/comments

https://perico415.itch.io/


¿El desarrollador está mentalmente enfermo? No lo digo como un insulto, simplemente literalmente jugando todos sus juegos y me da las vibraciones de un esquizofrénico tratando de hacer un juego





Alo cual respondi:  

Vincent van Gogh, pintor holandés, también tenía problemas mentales, y mira como está valorada su obra.






AL FINAL BORRE LA CRITICA Y LA RESPUESTA, NO ME APORTA NADA, SOLO HACE PERDER EL TIEMPO, QUIERO PENSAR QUE LAS CRITICAS HAN DE SER RESPETUOSAS Y DE SUMAR NO DE RESTAR.


En este enlace una critica constructiva




Si, el juego se puede ampliar más, claro, y pulir más, también es cierto, decidí publicarlo porque es completo, tiene una trama mínima y un final donde ganas la partida al escapar de la persecución...vaya, vamos a pasar un enlace de YouTube donde aparezca el juego completo, hay partidas muy cortas pero todas tienen un final razonable para que sea coherente.

sábado, 16 de agosto de 2025

Dispara en Godot 4.4 instanciando y moviendo el cañon en 4 angulos;

 extends Area3D


var Bullet = preload("res://BARCO ELEMENTOS TEXTURAS/CAÑONES/area_3dprollectil_cañon.tscn")

var fire_cooldown: float = 1.7

var can_fire: bool = true

var bullet_speed: float = 20.0

var fire_timer: Timer


# Asegúrate de que esta variable exista. La agregué aquí.

var rotation_speed: float = 1.0



func _ready() -> void:

fire_timer = Timer.new()

add_child(fire_timer)

fire_timer.wait_time = fire_cooldown

fire_timer.one_shot = true

fire_timer.timeout.connect(func(): can_fire = true)



func _process(delta: float) -> void:

# Lógica de Disparo

if Input.is_action_pressed("DISPARACAÑON") and can_fire:

can_fire = false

instantiate_bullet()

fire_timer.start()


# Lógica de Rotación

var rotation_direction: float = 0.0

if Input.is_action_pressed("girav"):

rotation_direction = 1.0

elif Input.is_action_pressed("girab"):

rotation_direction = -1.0

# Aplica la rotación en el eje X.

#rotate_x(rotation_speed * rotation_direction * delta)

rotate_x(delta * rotation_speed * rotation_direction  )


if Input.is_action_pressed("giraz"):   

rotation_direction = 1.0


# Si se presiona la acción "girax", gira en la dirección opuesta.

elif Input.is_action_pressed("girax"):

rotation_direction = -1.0


# Aplica la rotación en el eje Y.

# Si ninguna tecla está presionada, rotation_direction será 0 y el objeto no girará.

rotate_y(rotation_speed * rotation_direction * delta)



func instantiate_bullet() -> void:

var bullet = Bullet.instantiate()

bullet.global_transform = self.global_transform

if bullet is RigidBody3D:

bullet.apply_central_impulse(-self.global_transform.basis.z * bullet_speed)

else:

print("¡Error! La escena del proyectil no es un RigidBody3D y no puede recibir un impulso.")

get_tree().root.add_child(bullet)

viernes, 15 de agosto de 2025

¡¡El pirata marchoso!!;

https://perico415.itch.io/
 

GDScript que produce disparo de un proyectil y que mantiene su curso independientemente de si giramos el cañon;

 extends Area3D


var Bullet = preload("res://BARCO ELEMENTOS TEXTURAS/CAÑONES/area_3dprollectil_cañon.tscn")

var fire_cooldown: float = 1.7

var can_fire: bool = true

var bullet_speed: float = 20.0

var fire_timer: Timer


func _ready() -> void:

fire_timer = Timer.new()

add_child(fire_timer)

fire_timer.wait_time = fire_cooldown

fire_timer.one_shot = true

fire_timer.timeout.connect(func(): can_fire = true)


func _process(delta: float) -> void:

if Input.is_action_pressed("DISPARACAÑON") and can_fire:

can_fire = false

instantiate_bullet()

fire_timer.start()


func instantiate_bullet() -> void:

var bullet = Bullet.instantiate()

bullet.global_transform = self.global_transform

# Comprobamos que el nodo es un RigidBody3D antes de aplicar el impulso.

if bullet is RigidBody3D:

bullet.apply_central_impulse(-self.global_transform.basis.z * bullet_speed)

else:

print("¡Error! La escena del proyectil no es un RigidBody3D y no puede recibir un impulso.")

get_tree().root.add_child(bullet)

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

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

Explicacion: este Area3d que produce el disparo de un proyectil es hijo de una base que gira presionando las teclas -z-x, tenia el problema que cuando giraba el cañon el proyectil disparado tambien giraba como si formase parte del mismo giro del cañon y este GDScript corrige el problema, asi cuando disparo el proyectil sigue su curso en linea recta y en la direccion hacia donde realice el disparo y no se desvia por muchos giros que aga despues de realizado el disparo.    

"DISPARACAÑON" es el nombre asociado ala tecla-c- que realiza el disparo, se dice mapa de entrada y se prepara antes de realizar cualquier GDScript, y se puede aprovechar para futuros juegos, se pueden aprovechar todos los recursos anteriores de los mapas de entrada para futuros juegos sin tener que partir de cero continuamente.

GDScript para que un MeshInstance3D gire en su eje -y- presionando teclas del pc -z-x-;

 extends MeshInstance3D


# Velocidad de rotación en radianes por segundo.

@export var rotation_speed: float = 1.0


func _process(delta: float) -> void:

# Por defecto, la dirección de rotación es 0 (está quieto).

var rotation_direction: float = 0.0


# Si se presiona la acción "giraz", gira en una dirección.

if Input.is_action_pressed("giraz"):

rotation_direction = 1.0


# Si se presiona la acción "girax", gira en la dirección opuesta.

elif Input.is_action_pressed("girax"):

rotation_direction = -1.0


# Aplica la rotación en el eje Y.

# Si ninguna tecla está presionada, rotation_direction será 0 y el objeto no girará.

rotate_y(rotation_speed * rotation_direction * delta)

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

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

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

Explicacion: en mi nuevo videojuego de piratas y bucaneros e puesto unos cañones a bordo que mediante la presion de las teclas -z-x- hacen un giro de lado a lado en su eje -y-, en Godot asigne esas teclas en su mapa de entrada con los nombres "giraz" y "girax"   este gdscript cumple mi deseo a la perfeccion,.

Estudio de un desarrollador indie;

 ¡¡QUE LOCURA!!

 ¡¡QUE LOCURA!!

 ¡¡QUE LOCURA!!

 ¡¡QUE LOCURA!!
En mi habitacion, tengo 2 pc de torre con el windows XP que funcionan perfectamente, y repaso maravillas como Medall of de Honor, Farcry, entre otros....tengo 2 portatiles 1 msi el otro hp portátil pavilion el msi con 64Gb de ram, el hp portátil pavilion con 16Gb de ram
.

Estos tienen discos duros ssd con puertos usb, los de torre con xp discos duros normales, tambien con usb, .

Mis desarrollos los ago con los portatiles que tienen instalado el windows 11, antes usaba Unity pero probe Godot y me pase a Godot 4.4. 
Me encanta Godot, el de ram de 16 lo uso ahora para ver cine, cada fin de semana a la tarde lo enchufo a un proyector que no llega a los 100 euros y veo peliculas a unas 100 pulgadas prollectadas en mi habitacion, fabuloso!! y me da ideas para desarrollar mis juegos, tambien tengo una coleccion de videojuegos impresionante, que solo funcionan en el windows xp, ahora si quieres jugar en pc tienes que ir a steam.
Tengo tambien unas luces led que no consumen nada de electricidad y dan ambiente a mi estudio, funcionan con mando a distancia¡¡¡¡¡ toma ya¡¡¡¡¡ y hacen colorines y buelven mi ropa fluorescente como si estubiera en la discoteque......
Y libros tengo libros desde comics del capitan trueno, ediciones antiguas de la marvel spiderman 4 fantasticos, versiones modernas en libro, libros sobre videojuegos, programacion, Unity, Blender, historia de videojuegos 1001 videjuegos que has de jugar antes de palmar,  unos tomos de RBA una coleccion muy interesante, y peliculas a puntapala en dvd, y de Star Trek.
Y un par de ventiladores que hace una calor brutal.

Y muy poco tiempo libre para todo.

No doy a basto con mis ideas y con todo lo que quiero hacer.....soy desarrollador indie pero e de trabajar con otras cosas para poder comer.....en fin.

Boy haciendo.

lunes, 11 de agosto de 2025

¡¡El pirata loco!!;

perico415 - itch.io


Sobre la censura en Itch.io por los procesadores de pago;

 

Sobre la censura en itch.io por los procesadores de pago.

A fecha de hoy 11-8-25, y por lo que estoy viendo en yotube, la gente que se dedica como yo, y los aficionados, han echo muchas protestas ante las censuras impuestas por los procesadores de pago ,presionados por intereses externos a ellos.

De momento se han revisado leyes sobre las libertades de EEUU, y parece ser que los procesadores o sea los intermediarios para poder comprar y vender que manejan el dinero de los clientes, no tienen autoridad para decirle a una persona adulta en que se puede gastar su dinero.

A de mas no es ilegal si los videojuegos estan marcados como desarrollados para clientela adulta.

Seria ilegal si se vendiera a niños.


Itch.io seguramente se adaptara lo mejor posible a las nuevas normas que tenga que usar para avanzar hacia delante, con suerte todo sera como antes, quizas se vigile mejor, mas correctamente el contenido para adultos que se suba a estas plataformas, es absurdo que en un videojuego en el que solo hay una escena de topless y que esta calificado para adultos se retire para un pago, que es lo que me esta ocurriendo a mi con mis desarrollos, los e tenido que poner gratuitos, al menos para que se me vea que existo yo y mi trabajo, eso si estoy alucinando con las descargas que se hacen de mis videojuegos que antes eran de pago, llevo ya mas de 500 descargas, no si la gente no es tonta no¡¡¡ estan haciendo nunca mejor dicho el agosto¡¡¡¡

Ahora me tengo que esforzar mucho mas para vender algun videojuego, y lo voy a conseguir porque a tozudo no me gana nadie.perico415 - itch.io

viernes, 8 de agosto de 2025

En Godot 4.4 cuando algo pasa por su area3d solo instancia 4 personajes;

 extends Area3D


var Esferauno = preload("res://PIRATAMALOMORIR/PINTO MALO2 ANIMO DE MORIR.tscn")

var Esferauno1 = preload("res://PIRATAMALO/PINTO MALO1 ANIMO DE ANDARSALEDECAJA-2-.tscn")


var instancias_creadas : int = 0

const MAX_INSTANCIAS : int = 4


func _ready() -> void:

pass


func _process(delta: float) -> void:

pass


func _on_area_entered(area: Area3D) -> void:

# Verificamos si aún podemos crear más instancias.

if instancias_creadas < MAX_INSTANCIAS:

var parent = get_parent()

if parent and parent is CharacterBody3D:

var parent_global_transform = parent.global_transform

# Creamos la primera instancia

var policia_nokeado_instancia = Esferauno.instantiate()

get_tree().root.add_child(policia_nokeado_instancia)

policia_nokeado_instancia.global_transform = parent_global_transform

# Incrementamos el contador

instancias_creadas += 1


func _on_area_exited(area: Area3D) -> void:

# Verificamos si aún podemos crear más instancias.

if instancias_creadas < MAX_INSTANCIAS:

# Creamos la segunda instancia

var Esferauno1_instancia = Esferauno1.instantiate()

add_child(Esferauno1_instancia)

# Incrementamos el contador

instancias_creadas += 1

jueves, 7 de agosto de 2025

extends CharacterBody3D SE MUEVE ALEATORIAMENTE POR EL ESCENARIO INCLUSO INSTANCIADO;

 extends CharacterBody3D


# Exportamos la variable de velocidad.

@export var velocidad : float = 2.0


# Un array para guardar las 4 direcciones de movimiento.

# 0: Eje Z (adelante)

# 1: Eje X (derecha)

# 2: Eje -X (izquierda)

# 3: Eje -Z (atrás)

var direcciones : Array = [

Vector3(0, 0, 1),   # Adelante en el eje Z

Vector3(1, 0, 0),   # Derecha en el eje X

Vector3(-1, 0, 0),  # Izquierda en el eje -X

Vector3(0, 0, -1)   # Atrás en el eje -Z

]


# Un índice para saber en qué dirección del array estamos.

var paso_actual : int = 0


# Variables para manejar el tiempo manualmente.

var tiempo_transcurrido : float = 0.0

var intervalo_de_cambio : float = 0.5


func _physics_process(delta):

# Sumamos el tiempo de cada fotograma a nuestra variable.

tiempo_transcurrido += delta

# Si el tiempo transcurrido es mayor o igual al intervalo de 0.5 segundos...

if tiempo_transcurrido >= intervalo_de_cambio:

# Reiniciamos el contador de tiempo restando el intervalo.

# Esto evita errores si el tiempo excede el límite por poco.

tiempo_transcurrido -= intervalo_de_cambio

# Incrementamos el contador para pasar a la siguiente dirección.

paso_actual += 1

# Usamos el operador de módulo (%) para que el contador vuelva a 0

# después de llegar a 3 (0, 1, 2, 3, 0, 1...).

paso_actual %= 4


# Obtenemos la dirección actual del array y la multiplicamos por la velocidad.

velocity = direcciones[paso_actual] * velocidad

# Aplicamos el movimiento y gestionamos las colisiones.

move_and_slide()