Ciro Durán Un archivo vivo

Postmortem de RootPump

Video de RootPump como fue entregado en el Caracas Game Jam 2023

Un Caracas Game Jam más, otro juego hecho, otro postmortem. Estuve casi a punto de escoger PICO-8 nuevamente, pero en un arranque de iluminación decidí darle oportunidad a una herramienta que tenía tiempo queriendo usar: Godot Engine. Godot se ha popularizado en el Global Game Jam como una alternativa a los notorios Unity y Unreal Engine, y al ser un proyecto de código abierto, ha atraído a un segmento bien particular de los desarrolladores de videojuegos. RootPump (entrada en el Global Game Jam) fue el resultado de este año, y la experiencia me permitió formarme algunas opiniones acerca de Godot. El código fuente del juego está en GitHub.

Para comenzar a usar Godot basta con bajar el ejecutable de su página de descargas, la versión 3.5 estable que es la más reciente al momento. Conocía abstractamente que Godot tenía soporte para GDScript, su lenguaje de scripting parecido a Python, y C#. Estoy familiarizado bastante con C# así que me fui por la opción de Godot con soporte para este lenguaje. Con Visual Studio Code ya previamente en mi máquina, instalé las extensiones godot-tools y C# Tools for Godot para facilitar el desarrollo. Durante el evento, cloné el repositorio de código fuente de Godot y esto me permitió navegar en el código desde mi proyecto y resolver muchísimas dudas.

La documentación oficial de Godot es bastante útil. No sólo contiene referencia al código, sino que también tiene artículos para ayudar a implementar lo que tengas en mente. Sin embargo, la documentación oficial generada sólo incluye la referencia a GDScript. La interfaz en C# está documentada en el código, así que es cuestión de generarla para tener una referencia igual de buena que la de GDScript, y paulloz ha tenido la cortesía de generar esta documentación, lo cual fue clave para entender el motor y entender las diferencias con GDScript. Sería bueno que esta referencia estuviese incluída en la documentación oficial si Godot sigue manteniendo su interfaz en este lenguaje.

Concebí RootPump como un juego de ritmo en el que las raíces de una planta crecen de acuerdo a cómo el jugador lleve el ritmo de una canción. Idealmente el gameplay del juego se llevaría a cabo con un solo botón. Decidí que dibujaría los gráficos con cualquiera que fuese la interfaz de código para dibujar en 2D en Godot (al momento lo desconocía), y que utilizaría la interfaz para reproducir audio pre-grabado (también lo desconocía).

Fue entonces una sorpresa agradable conseguirme con un sistema para componer escenas que me es familiar: en Godot una escena es un archivo que contiene un árbol de nodos Node2D. De esa manera, es posible obtener algún nodo a partir de un string (e.g. “Cosa1/Cosa2” para obtener el nodo llamado Cosa2 anidado en Cosa1). Es posible conectar un nodo con un script, y así es posible escribir código para ese nodo. Y así fue mayormente mi ciclo de desarrollo: usé el editor para añadir algunos nodos básicos, poner los elementos de las pantallas, y de resto pasé la mayor parte del tiempo en VSCode escribiendo código para luego probar los cambios en el editor.

Godot tiene una buena cantidad de rutinas matemáticas (Math2f) específicas para videojuegos y no pasé tiempo reimplementando esa funcionalidad. Si ya sabes lo que quieres hacer, todo está a la mano. Godot también ofrece una implementación del patrón observable llamado Signals, en el que es posible que los objetos interesados estén informados cuando ocurre un evento. Esto forma parte de Node2D, así que es muy fácil integrarlo. Sin embargo, en la implementación de mi juego hice varias cosas que no descendían de Node2D y no me fue posible usar las señales.

El sistema de input de Godot me gusta. Godot tiene un mapa abstracto de acciones, y a cada acción se le asocia un botón (o tecla, o acción del control), y luego en código se comprueba si esa acción está presionada, o “ha sido apenas presionada” (para acciones que solo requieren comprobar la primera vez que pasa en un frame).

Godot tiene un sistema de plugins para aumentar la funcionalidad del editor. Solo tuve la oportunidad de probar un plugin, el de git para manejar el versionamiento. Es un buen plugin, provee una interfaz gráfica para git, pero nada que TortoiseGit no ofreciese ya.

La otra agradable sorpresa fue conseguirme con una interfaz de audio bastante buena. Es posible tener varios canales de audio (Audio Buses, se llama el concepto), a los cuales es posible aplicarle efectos de sonido separadamente. Godot incluye también una sección que describe cómo sincronizar el audio con el juego lo cual me cayó de perlas y me ahorró mucho tiempo. La música la hice con Ableton Live, pero realmente no le presté atención, así que me fui por lo más básico. Finalizada la música, exporté los 3 stems a MP3 por separado, y en el juego se escuchan los 3 canales simultáneamente. Me quedó la curiosidad de todas las cosas que se pueden hacer con este setup.

Finalmente aprendí cómo hacer builds de mi juego, hasta entonces sólo había probado directamente dentro del editor. Godot tiene templates para exportar, uno por cada plataforma a la que puedes hacer un build (Windows, Mac, Web, etc.). Esto es una descarga separada que se inicia dentro del mismo editor. Desde el principio había considerado hacer RootPump para Windows, pero definitivamente tenía la curiosidad de ver cómo se comportaba el juego en web. Lamentablemente, el juego se tranca como a los 3 segundos de iniciar la ronda, y creo que es por el setup del audio que hice. Creo que hace falta ser más cuidadoso para exportar a Web, y es algo que vale la pena hacer con más calma, sin la presión de un game jam. Gracias a Edmundo que probó hacer el build en Mac: funciona bien salvo que el build pide permisos para usar el micrófono, y esto está aparentemente cableado en la presente versión de Godot.

El tiempo al final se me hizo corto para implementar el mínimo que esperaba al término del evento. En efecto tengo un árbol que crece, un pulso que se mueve a cierto ritmo, y un mecanismo para comprobar si el jugador va al ritmo de la canción que suena. Los dos mecanismos no están conectados, lamentablemente. Me hubiese gustado que el jugador tuviese mayor control de la dirección del pulso, y tal vez el control hubiese necesitado una dirección para mover el pulso.

Al final, las limitaciones fueron de tiempo, y siento que la herramienta trabajó conmigo, y no en contra mío. Escogería Godot nuevamente para un próximo proyecto.