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