domingo, 6 de septiembre de 2026

Página 235: Diario de desarrollo "El laberinto procedural: Reorganizando el proyecto y creando el Debug"

 

Volvemos de nuevo. He hecho más optimización del código y algunas mejoras aquí y allá. Como cosas destacables, ahora la matriz se guarda en una clase global para que sea más accesible. No tenía mucho sentido pasarles el mundo entero a las excavadoras para que pudieran acceder a ella.

También he cambiado los 0 y 1 de la matriz por una clase que representa la información de cada casilla. De momento, entre esa información está el tipo de bloque, pero habrá más cosas guardadas en cada casilla.

También he metido una ventana de Debug que indica el número de bloques de cada tipo y las funciones que se van ejecutando, así que menos parloteo y más escribir en el diario.


He desacoplado elementos como la matriz en LevelManager.gd y los tipos de cubos en BlockManager.gd, colocando cada uno dentro de una clase global. De esta forma, establezco en un solo sitio las reglas del juego, ya sea el tipo de cubos que existen o la información de la matriz, en lugar de tener esta información repartida por clases que no corresponden.

Con esto mencionado, vamos a hablar de la clase InfoCasillaMatriz.gd, que de momento solo guarda el tipo de bloque, usando como referencia los bloques que hay en BlockManager.gd, y su posición real en el mapa del juego.

En lugar de decir directamente que una casilla tiene un bloque u otro, esta clase me permite ir guardando qué otros elementos contiene esa casilla. Podría ser desde objetos hasta reglas del juego, como reducir la velocidad, drenar vida, entre otras cosas.

 

Ahora vamos a por las clases globales.

LevelManager, que guarda la información relacionada con la matriz. Conservo ancho y largo para evitar líos con las coordenadas. También tiene sus funciones de Debug.

 

BlockManager se encarga de recopilar los tipos de cubos y de gestionar algunas cosas relacionadas con las casillas y sus posiciones.

Mientras escribo esto, creo que podría fusionarlo con LevelManager, pero ya lo pensaré. Bueno, dejo el código.

Cosas a destacar: obtenerReferencia es una función que busca el suelo más cercano a una posición y devuelve dicha posición. Es muy útil para no tener que meter a mano las coordenadas del jugador.

GenerarInfoCasilla sirve para ahorrarme tener que repetir las mismas líneas cada vez que creo una variable InfoCasillaMatriz.

 

Y ahora más movidas para no tener que picar código a manubrio. He creado los excavadores mediante dos recursos: uno donde guardar la información de cada excavador y un Garage que contiene un array con todos los excavadores del juego.

También estableceremos cuál será el excavador principal. Esto significa que esa será la zona principal a la que se conectarán los otros túneles.

OrdenExcavador.gd

 

Garage.gd

 

Y la última escena creada, Debug.tscn, que es la interfaz del Debug.

  

 

La función addLog me ha costado más de lo que me gustaría reconocer. La idea es que cada línea nueva suba las demás líneas y haga desaparecer la última, pero como está organizado el array, no ha sido tan intuitivo.

El principio del array es la línea de arriba del todo en la parte visual, así que tuve algunos líos con el orden.

Con las nuevas cositas agregadas y comentadas, toca mostrar la optimización del código.

Código del mundo.

 

Al gestor de bloques le hemos quitado el listado de bloques. Ya no le hace falta saber qué bloques existen; solo tiene que encargarse de situarlos en el mundo y mostrar el bloque que le pasan.

 

He optimizado al excavador. Entre las cosas mejoradas está que ya no excava los bloques situados en los límites. También he metido un clamp para evitar que el jugador mande un excavador fuera del array o que aparezca en los límites del mapa.

 

He trasteado un poco más con el jugador, agregando algunos efectos de sonido, movimiento de cámara al moverse e intensificándolo al correr.

 

 

 


Creía que había hecho mucho más, pero al final ha sido más tiempo peleándome con el código y preguntándome por qué no funcionan las cosas que implementando cosas nuevas. Ya parece esto el desarrollo de Hytale: muchas mejoras y poca jugabilidad nueva.

Para la próxima entrada voy a meter objetos para recolectar y una meta. Una vez finalizado el nivel, se generará otro, ya un poco para meterle algo de jugabilidad, porque me falta implementar los prefabs a las excavadoras. 

He subido el proyecto a GitHub en su estado actual, pero más que nada como plantilla para futuros proyectos. No va a ser una costumbre; iré subiendo versiones diferentes. En principio, no tenía pensado subir nada a GitHub.

 https://github.com/ApuntesGodot/apuntesgodot.blogspot.com/tree/main/laberinto-procedural

Bueno, todo esto lo veremos si no decido abandonar el blog, así que hasta luego o hasta nunca.


 

No hay comentarios:

Publicar un comentario