#4 Implementando un event bus en Godot
La pesadilla de cualquier developer, punteros vacíos, referencias nulas, objetos que no existen ya… bugs y crasheos infinitos, independientemente de si es Godot, Unity, Unreal… o cualquier entorno de desarrollo (bueno, quizás con alguna excepción de Rust, claro)
Al inicio del desarrollo de Impious, tenía esto bastante claro: » RReducir las referencias a objetos al mínimo, simplificar el código y evitar que unos elementos dependan innecesariamente de otros».

Y es que, definitivamente es más sencillo y eficiente hacer llamadas directas a lo que necesitas cuando quieres prototipar algo rápido, pero un proyecto de relativa complejidad y tamaño, requiere andar con cuidado.
Y así estuve evitando en cierta medida este tipo de llamadas y referencias, pero a veces, debido al cansancio mental, puedes caer en la tentación y no ser consistente a la hora de escribir el código (cada cosa se comunica de diferente manera según tengas el día).
No es que tuviera teniendo un problema gordo con ello, pero veía que a medida que avanzaba, me iban dando problemas diferentes referencias, ya que el juego no es estático, sino que se va generando a medida que el jugador avanza. Este tipo de desarrollo puede ser un nido de problemas a la larga ya que, comunicarse con objetos que se generan y destruyen en runtime manteniendo referencias directas es muy mala idea.
Lo que no tenía era una manera CONSISTENTE de comunicar unos objetos con otros, necesitaba abstraerlo, así que durante el refactor, decidí que lo mejor era un sistema robusto de eventos, un Event Bus.
Con éste singleton, y en apenas 50 líneas, he centralizado muchísima de la funcionalidad del juego, y por ende, minimizado de gran manera los bugs y crasheos inesperados.

Nadie sabe que nadie existe, y eso es bueno.
Objetos se suscriben a eventos, y no saben quién les emite, pero reciben datos.


Objetos emiten eventos, y no saben quién está suscrito a esos eventos, pero mandan datos

Esto es increíblemente útil, sobre todo, cuando necesitas hacer un cambio gordo en la arquitectura, o incluir algo nuevo, ya que si quieres que algo mande alguna señal o reciba, no interferirá mucho con el código actual, y eso es muy de agradecer.
Obviamente tiene sus contras y es bastante engorroso y requiere planificación.
También es difícil de debugear, ya que no es fácil seguir la huella de cada señal, así que, realmente requiere algún tipo de herramienta custom para ver qué está conectado a qué, y quién emite qué.

En mi caso hice un panel muy muy sencillo que se actualiza con los eventos que hay suscritos y sus suscriptores. Quería hacer algo mucho más legible y mejor, pero realmente no lo estoy necesitando tanto de momento, con buenas herramientas de búsqueda me basta de momento para ver quién se suscribe a quién.

Y nada, solo eso, quería escribir un post rápido sobre el asunto.
Considera echar un ojo al proyecto en steam y darle a Wishlist si te interesa!
Gracias por leer y hasta la próxima.
¡Seguimos!