lunes, 14 de septiembre de 2026

Página 237: Diario de desarrollo "El laberinto procedural: Objetivos, jugabilidad y reorganización del código"

 

Buenas de nuevo, el juego ya va tomando forma. He añadido objetivos al juego y he hecho que los niveles se puedan superar completando objetivos, consiguiendo X monedas, obteniendo una llave para bajar la jaula o cumpliendo ambas metas.

Como parece que ya se está volviendo costumbre, he vuelto a reorganizar el código. Se me estaba haciendo doloroso trabajar con él.


He cambiado el nombre de BlockManager a CellManager. Creo que es un nombre más correcto. CellManager es como el jefe de las InfoCasilla: se encarga de buscar información entre las casillas.
 
 

Ahora InfoCasilla (antes InfoCasillaMatriz) solo se va a encargar de guardar información. Fuera queda eso de mandar a dibujar los bloques y los items que contiene esa casilla (los assets).

Los assets, como las monedas y las llaves, podría lanzarlos tal cual al mapa sin guardarlos, pero me he dado cuenta de que así pierdo el control, sobre todo si necesito buscar un asset en concreto.

Con este código podemos reservar la casilla; es decir, el buscador de casillas de CellManager las filtrará cuando busquemos casillas libres. También hay un límite de cuántos items puede haber en una casilla.

Como cabría esperar, tiene varias funciones para buscar assets concretos según su subclase.

 
 
Antes de ver los assets, vamos a ver el autoloader GameManager. Este se encarga de establecer el objetivo del nivel actual y gestionar los coleccionables. Para esta entrada, tenemos las monedas y las llaves.
 
 

El jefe de los assets es el autoloader AssetManager, que de momento solo colecciona los tipos de objeto. Está un poco pensado a futuro, para poder agrupar los tipos de items.

De este grupo, los relevantes son GamePlay, que son cosas como la meta o el inicio que modifican las reglas de juego; Entorno, mera decoración que no hace nada; y Coleccionable, que es todo lo que el jugador pueda recoger y acumular en un contador. 

 
 
Los Assets tienen dos partes: la clase principal, que es Asset, y la subclase: Moneda, Llave, Meta o Inicio. Como se puede intuir, es una forma de identificar qué tipo de asset es.
 
 
El script de la moneda.
 
 
 
Y el script de la llave.
 
 
 
Comportamiento de la meta.
 
 
Con el asset de Inicio comento que ahora el player ya no lo tiramos al mapa con X coordenadas, sino que usaremos el inicio como spawner.
 
 
 
Hice un asset que es una jaula que necesita una llave para abrirse, pero creo que se me ha ido de las manos, porque su funcionamiento está en el StaticBody3D, para que el RayCast3D del jugador lo detecte. Lo suyo sería que estuviera en el nodo padre, pero bueno, ya veré qué hacer. De momento me he conformado con que funcione.
 
 
 
Esa suma de posición es para evitar que se hunda en el suelo. Me parece un poco cutre, pero de momento me sirve.
 
 
 
Al StaticBody3D lo he metido en una capa más, la capa Interactuable, para evitar que el RayCast3D del jugador salte con cualquier cosa.
 
 
 
Ahora, vamos a mostrar por pantalla las llaves, la moneda y la meta de monedas. Toca crear una escena con un script que lo muestre por UI.
 
 
 
El script de MundoLaberinto se ha vuelto el hub principal, de interconectar todas las piezas. Lee la matriz, ordena dibujar y conecta señales con la UI.
 
 
Al jugador le he metido algunas mejoras, aparte del RayCast3D: efectos de sonido y un sistema de carrera que de tanto en tanto falla y es como si la pulsación del SHIFT se quedase pulsada. Podría ser mi teclado, que se queda el Shift pegado.
 
  
 
Y ya para terminar, un cambio que hice para evitar que dibujarAsset me meta items en la misma ranura. Consiste en hacer un shuffle al array e ir metiendo items al array usando un índice.
 
 

Menos mal que estas entradas no esta pensadas como tutorial, mas como mi diario de como estoy haciendo las cosas.

La idea es que si alguien random con conocimientos de Godot lea esto y reaccione de esta forma. 

 

Hasta otra o hasta nunca.


 

No hay comentarios:

Publicar un comentario