lunes, 26 de enero de 2026

Dos formas de movimientos aleatorios de un CollisionShape3D;

 extends CollisionShape3D


# --- AJUSTES DE MOVIMIENTO ---

@export var velocidad : float = 5.0

@export var margen_movimiento : Vector3 = Vector3(3.0, 2.0, 3.0) # Cuánto se mueve en X, Y, Z


# --- VARIABLES INTERNAS ---

var posicion_inicial : Vector3

var objetivo : Vector3


func _ready():

posicion_inicial = position

_nuevo_punto_aleatorio()


func _process(delta):

# Movemos el láser hacia el punto objetivo

position = position.move_toward(objetivo, velocidad * delta)

# Si llega al punto, elige otro

if position.distance_to(objetivo) < 0.1:

_nuevo_punto_aleatorio()


func _nuevo_punto_aleatorio():

# Calculamos un punto nuevo que NO se salga del margen

var x_random = randf_range(posicion_inicial.x - margen_movimiento.x, posicion_inicial.x + margen_movimiento.x)

var y_random = randf_range(posicion_inicial.y - margen_movimiento.y, posicion_inicial.y + margen_movimiento.y)

var z_random = randf_range(posicion_inicial.z - margen_movimiento.z, posicion_inicial.z + margen_movimiento.z)

objetivo = Vector3(x_random, y_random, z_random)

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


extends CollisionShape3D

# El rango máximo que se podrá mover desde su posición original
@export var amplitud : float = 89.05 
# La velocidad a la que cambia de posición
@export var rapidez : float = 0.7 

var posicion_original : Vector3

func _ready():
# Guardamos la posición inicial para que no se escape al infinito
posicion_original = position

func _process(delta):
# Creamos un movimiento aleatorio para cada eje
var movimiento = Vector3(
randf_range(-amplitud, amplitud),
randf_range(-amplitud, amplitud),
randf_range(-amplitud, amplitud)
)
# Aplicamos el movimiento suavizado con lerp para que no sea un teletransporte brusco
position = position.lerp(posicion_original + movimiento, rapidez * delta)



domingo, 25 de enero de 2026

GDScript otro ejemplo de varias camaras en Godot 4.5 3d;

 extends Node


# Variables para guardar las cámaras

var Camera3Dparediz : Camera3D

var Camera3Dparediz2 : Camera3D

var Camera3Dladron : Camera3D


func _ready():

# 1. LOCALIZAMOS LOS NODOS (Tus rutas perfectas)

Camera3Dparediz= $"Camera3Dparediz"

Camera3Dparediz2= $"Camera3Dparediz2"

Camera3Dladron= $"../CHARACTERBODY/MeshInstance3D2/Camera3Dladron"



# 2. LIMPIEZA INICIAL (Apagamos todo menos la primera)

if Camera3Dparediz2: Camera3Dparediz2.current = false

if Camera3Dparediz: Camera3Dparediz.current = false

if Camera3Dladron: Camera3Dladron.current = true

# 3. PRIMER ACTO: JAPONÉS 1

if Camera3Dparediz:

Camera3Dparediz.current = true

print("--- 1. JAPONÉS 1 ACTIVO (10s) ---")

await get_tree().create_timer(5.0).timeout

if Camera3Dparediz: Camera3Dparediz.current = false # Apagamos Japones 1

if Camera3Dparediz2:

Camera3Dparediz2.current = true

print("--- 2. GRÚA ACTIVA (20s) ---")

await get_tree().create_timer(10.0).timeout

if Camera3Dladron:

Camera3Dladron.current = true

print("--- 1. JAPONÉS 1 ACTIVO (10s) ---")

await get_tree().create_timer(15.0).timeout

Nuevo Devlog; avances para Stealing from the history museum;

 I'm continuing to work on my game, Stealing from the History Museum, by perico415. This is a preview for Windows and Linux. I'm only posting about 22 seconds of the first level and another 22 seconds of the second, because what I'm really interested in is showing the work on the third level so you can see my progress with the camera controls. I really like movies and I've achieved a cinematic feel to the game... It's January now, and I'm already saying I'll dedicate a year to the game. It's possible I'll go beyond the 8 or 10 levels I was planning and make 12 or more.

A brief summary of what I've done so far:

Level 1 - The thief fights living paintings

Level 2 - The thief has to destroy some laser lights

Level 3 - The thief has to get past many people blocking his path in a room... (in development...)



Sigo avanzando mi juego Stealing from the history museum. by perico415  un avance para windows y linux, solo pongo unos 22 segundos del primer nivel y otros 22  del segundo nivel , por que lo que me interesa es mostrar  el estudio del tercer nivel para que veáis mis avances con el juego de las cámaras, me gusta mucho el cine y e conseguido un manejo cinematográfico del juego….estamos en enero,,,ya voy comentando que le dedicare 1 año al juego, es posible que supere los 8 o 10 niveles que pensaba darle y aga unos 12 o mas, 

Un breve resumen de lo echo asta ahora.

Nivel 1- el ladrón se pelea con cuadros vivientes-

Nivel 2- el ladrón a de destruir unas luces láser-

Nivel 3- el ladrón a de sortear mucha gente que le estorba el paso en una sala…...(en desarrollo...)

https://perico415.itch.io/stealing-from-the-history-museum/devlog/1328869/level-3-the-thief-has-to-get-past-many-people-blocking-his-path-in-a-room-in-development



captura de pantalla, me encanta este aire profesional de las versiones,,0.0.1   ..... 0.0.2    .... 0.0.3 ....    0.0.4 .....    etc... etc queda genial.


captura de pantalla, me encanta este aire profesional de las versiones,,0.0.1   ..... 0.0.2    .... 0.0.3 ....    0.0.4 .....    etc... etc queda genial.


sábado, 24 de enero de 2026

Muy buen GDScript para jugar con 3 y 4 camaras;

 extends Node


# Variables para guardar las cámaras

var camara_japones : Camera3D

var camara_grua : Camera3D

var camara_japones2 : Camera3D

var camara_ladron : Camera3D


func _ready():

# 1. LOCALIZAMOS LOS NODOS (Tus rutas perfectas)

camara_japones = $"WorldEnvironment/guia de turista 2 limpio NO TOCAR3/Camera3Djapones"

camara_grua = $"WorldEnvironment/GRUACAMARA/Camera3Dgrua"

camara_japones2 = $"WorldEnvironment/guia de turista 2 limpio NO TOCAR2/Camera3Djapones2"

camara_ladron = $"WorldEnvironment/CHARACTERBODY/MeshInstance3D2/Camera3Dladron"


# 2. LIMPIEZA INICIAL (Apagamos todo menos la primera)

if camara_grua: camara_grua.current = false

if camara_japones2: camara_japones2.current = false

if camara_ladron: camara_ladron.current = false

# 3. PRIMER ACTO: JAPONÉS 1

if camara_japones:

camara_japones.current = true

print("--- 1. JAPONÉS 1 ACTIVO (10s) ---")

await get_tree().create_timer(5.0).timeout

# 4. SEGUNDO ACTO: LA GRÚA

if camara_japones: camara_japones.current = false # Apagamos Japones 1

if camara_grua:

camara_grua.current = true

print("--- 2. GRÚA ACTIVA (20s) ---")

await get_tree().create_timer(10.0).timeout

# 5. TERCER ACTO: JAPONÉS 2

if camara_grua: camara_grua.current = false # Apagamos Grúa

if camara_japones2:

camara_japones2.current = true

print("--- 3. JAPONÉS 2 ACTIVO (30s) ---")

await get_tree().create_timer(15.0).timeout

# 6. ACTO FINAL: EL LADRÓN (Toma el control)

if camara_japones2: camara_japones2.current = false # Apagamos Japones 2

if camara_ladron:

camara_ladron.current = true

print("--- FINAL: LADRÓN ACTIVO. ¡A JUGAR! ---")


jueves, 22 de enero de 2026

Resumen de lo conseguido trabajado asta ahora de mi juego Stealing from the history museum. by perico415;

 


Resumen de lo conseguido trabajado asta ahora de mi juego Stealing from the history museum. by perico415


Primer nivel, El personaje el ladrón aparece en una ventana, a subido a una sala del museo y tiene la capacidad de colocar explosivos, lanzar explosivos y disparar, revienta una puerta colocando una bomba por temporizador, ojo has de apartarte, puedes morir con tu propio explosivo,



consigues entrar en la sala y hay una serie de cuadros, dos de ellos son intrigantes, te acercas a ellos y surgen una especie como de fantasmas que te persiguen, si te tocan mueres y has de reiniciar ese nivel, al morir salen escenas de muerte, y buelbe a empezar el nivel, si disparas a los fantasmas estos se convierten en humo, cuando aparecen hay una cámara que los enfoca en exclusiva a ellos unos instantes, tu por tu cuenta puedes mover la cámara por el juego como te de la gana, rotar alrededor del personaje acercarte alejarte, una pasada vamos..


Cuando los destruyes se habré una entrada a otra sala, en esta hay unos láseres que recorren la sala de un punto a otro si te toca una luz también mueres y se reinicia el juego desde ese punto desde esa misma sala, has de disparar a unos interruptores que apagan esos láseres, Entonces vas a la tercera sala o nivel escena en esta estoy empezando a poner personajes , turistas japoneses en esa sala pero docenas de ellos que están buscando, fotografiando, paseando, incordiando, molestando al ladrón…….y asta hay lo que estoy trabajando...continuara...


GDScript para mover un extends MeshInstance3D en forma de ir y retornar;

 extends MeshInstance3D


# --- VALORES AJUSTABLES ---

@export var velocidad : float = 0.2      # Qué tan rápido camina

@export var ancho_ovalo : float = 0.3   # Distancia hacia los lados (Eje X)

@export var largo_ovalo : float = 5.0   # Distancia adelante y atrás (Eje Z)


var tiempo : float = 0.0


func _process(delta):

# El tiempo va corriendo...

tiempo += delta * velocidad

# Calculamos la nueva posición usando Seno y Coseno

# El Coseno hace el movimiento de adelante/atrás (Z)

# El Seno hace el movimiento de izquierda/derecha (X)

var nueva_x = sin(tiempo) * ancho_ovalo

var nueva_z = cos(tiempo) * largo_ovalo

# Aplicamos la posición

global_position = Vector3(nueva_x, global_position.y, nueva_z)

# --- ESTO HACE QUE EL PERSONAJE MIRE HACIA DONDE CAMINA ---

# Calculamos hacia dónde irá en el siguiente fotograma para rotarlo

var objetivo_mirada = Vector3(sin(tiempo + 0.1) * ancho_ovalo, global_position.y, cos(tiempo + 0.1) * largo_ovalo)

look_at(objetivo_mirada, Vector3.UP)





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

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

Explicacion: en un nivel de mi nuevo juego   https://perico415.itch.io/stealing-from-the-history-museum

quiero poner unos turistas japoneses dando vueltas por una sala , van vienen, el MeshInstance3D es el padre donde alojara el hijo, el personaje en 3d en formato fbx, con animacion de Mixamo de caminar.....




Depurador;


 

Depurador; últimamente estoy indagando en este tema cuando desarrollo mi ultimo juego, al que pienso dedicarle 1 año de trabajo, cuando pruebo el juego veo que sale una zona del motor de juegos de Godot 4.5 llamada depurador donde salen una serie de errores, llegue a tener 400 y con ayuda de la IA los baje a unos 20, si voy hacer mi primer videojuego mas largo de lo que ago habitualmente ya me quiero preocupar de aspectos que nunca toco.


Según consulte a la IA si voy acumulando errores y no miro de solucionarlos, llegara un punto que mi juego puede colapsar o romperse, dejar de ser jugable vamos pararse.


Así que de tanto en tanto le consulto, y me ayuda un montón, los errores de color amarillo no son peligrosos pero los miro de arreglar igual porque son los mas fáciles de solucionar, según la IA y acierta en la solución, la mayoría son errores de programación del GDScript al cual le falta algún guion delante de alguna palabra del código, por ejemplo escribo la palabra “delta” en una linea del código y este funciona no impide que se ejecute el juego, pero lo correcto es escribir “_delta”,, va un guion delante,

Ago la corrección y ejecuto el juego y ….solucionado, Luego están los errores que salen en color de rojo en el motor de juegos de Godot 4.5, estos son un pelin mas complicados de solucionar, así que copio lo que dice ese error y se lo paso a la IA y procuro solucionarlo, algunos son complicados de buscar y solucionar pero los mas generales y numerosos se suelen arreglar gracias a la IA, .


Según le consulte sobre los juegos profesionales que están en el mercado, todos tienen miles de errores de depuración, errores de programación y de otros asuntos, pero si el videojuego corre y no se para y puedes resolverlo asta el final, pues esa es la tarea importante y final.


Conclusión, ir trabajando mi juego e ir depurando limpiando de tanto en tanto lo mejor que sea capaz , pero sin obsesionarme , si el juego corre y se puede llegar asta darle un final…...tengo mi juego terminado