FEMCODE v0.1: Generación Procedimental de Mapas

Del 16 al 2 de julio tuvo lugar, de manera informal, el primer reto de programación de la comunidad de FemDevs. El objetivo consistía en escoger alguna mecánica o técnica utilizada en videojuegos, investigar bibliografía o juegos donde la utilizaran e implementarla, con plena libertad en cuanto a la elección de la tecnología o plataforma de distribución. A más alto nivel, la misión principal era practicar, aprender y divertirse.

Tras unos días de votación, el tema ganador fue la generación procedimental de mapas, por encima de otros como la implementación de cámaras 2D, sistemas de diálogos o lógica de combate por turnos a lo JRPG.

La creación automatizada de contenido es un área del desarrollo que suele resultar muy atrayente y se utiliza en un número cada vez mayor de juegos por una serie de razones. En primer lugar, por el reto que supone para los desarrolladores la lógica de generación en sí (ya sea un nivel de un plataformas como el Spelunky, un área en el Diablo 2 o un planeta completo como en No Man’s Sky), así como el ajuste y pulido de esa lógica de manera que ese contenido se sienta variado, nuevo y desafiante tanto mecánica como estéticamente. Si tenemos éxito aplicando este tipo de técnicas, podemos dotar a nuestros juegos de una rejugabilidad inmensa con un esfuerzo menor del que requeriría crear todo ese contenido de manera manual (dichos esfuerzos se centrarían en cambio en definir y revisar las reglas de los generadores).

Un ejemplo de cómo se ha generado un nivel en Spelunky (fuente)

Aunque la generación procedimental puede aplicarse a muchos tipos de contenido, en esta ocasión nos centramos exclusivamente en la creación de niveles. Inicialmente se había puesto el foco en la obtención de mapas más orgánicos, como sistemas de cavernas o islas pero decidimos abrirlo a otros tipos de niveles, como laberintos, o mazmorras con salas regulares, lo que ofrecía más posibilidades a la hora de explorar algoritmos.

A continuación enlazamos a las demos de las participantes, junto a un breve resumen de las mismas por parte de sus autoras. Desde los enlaces, además, puede accederse al código fuente y/o explicaciones más detalladas.

Random path generator

@Firenz (About.me)

https://firenz.github.io/femdevs-procedural-level-challenge/

Resumen: Trabajando entre semana, me resultó imposible dedicarme las dos semanas del reto y en un principio ni iba a participar, pero al final me animé y me propuse que en los dos días de un fin de semana, sacar algo.

Opté por usar Phaser, una librería JS dedicada en hacer juegos que había tocado un poco antes, por su simpleza para hacer cosas básicas rápidamente y porque quería que el resultado del juego se pudiera jugar desde la web del repositorio.

Con el poco tiempo disponible, centré el desarrollo en la generación procedural más básica con el Drunkard Walk Algorithm: dada una cantidad de pasos, por cada paso el algoritmo genera un trozo de camino (en este caso suelo) en una posición adyacente aleatoria con respecto al paso anterior.

Luego para que no quedase tan simple ni con utilidad alguna más que la meramente estética, aproveché los puntos de inicio y final del camino para generar un personaje jugable y un cofre. Cuando el personaje toca el cofre, ya no se puede mover más y tendría que reiniciarse el juego para empezar otra vez.

Luego tocó meter muros para evitar que el personaje jugable se saliese de la zona pisable, esto aunque pareciera un poco tonto me costó trabajo. Para generar tiles con diferentes propiedades (suelo y pared) tenía que crear clases distintas que extienden la clase de Graphics de Phaser y tuve varios problemas a la hora de que se generasen bien las colisiones de los muros. Al final arreglar esto me tardó más tiempo que la implementación del algoritmo procedural en sí.

Cosas que se quedaron fuera de tiempo: el conseguir dibujar al personaje jugable por encima del cofre y el crear un botón para resetear el juego, en vez de tener que pulsar F5. Quizás en un futuro las añada como features post-reto…

Tecnología: Phaser + JS/HTML5

Olsyx map generator

@darkatom (About.me)

https://darkatom.github.io/RandomMapGenerator/

Resumen: Para este reto pretendía explorar la generación de mapas mediante el uso de autómatas celulares unidimensionales para producir formas orgánicas. Estos autómatas se basan en generar mapas de ruido que luego se procesan, una casilla cada vez, en base a unas reglas que toman como referencia los vecinos activos de la casilla y deciden si ésta permanecerá activa (viva) o no.

Durante el estudio de los autómatas celulares comprendí que se pueden fraccionar en tres componentes: pasadas, reglas y vecindarios. Para que los mapas fueran más interesantes y diversos, implementé cada componente por separado, dándoles a cada uno varias opciones, de forma que fueran intercambiables y combinables.

El bosque y las montañas son generados automáticamente si sus opciones están seleccionadas.

Que se pueda cambiar el color de las casillas es algo intencionado, ya que de esta forma podríamos convertir el agua en las paredes de una cueva, y el bosque y las montañas en accidentes del fondo o detalles.

Tecnología: Propia, sobre JS/HTML5

Procedural Map Generator

@athoka (Twitter)

https://github.com/Athoka/ProceduralMapGeneration

Resumen: El propósito principal del proyecto es una primera aproximación a los algoritmos de generación procedural de contenido, en este caso mapas que se pueden interpretar de varias formas (cavernas, islas, lo que se necesite). Tanto el algoritmo utilizado como la interfaz que lo representa son muy simples, ya que era la primera vez que me enfrentaba a algoritmos procedurales y todo el esfuerzo del reto ha estado concentrado en su funcionamiento.

Tecnología: Propia, sobre Java

Cavegen!

@ithil(Portfolio)

https://wildrabbit.github.io/cavegen/spanish

Resumen: Con esta demo pretendía explorar una serie de algoritmos clásicos de generación de niveles, típicamente utilizados en roguelikes o roguelites, pero no necesariamente limitados a este género. El título corresponde al nombre que puse al proyecto en Visual Studio: inicialmente pensaba orientarlo más a cuevas, pero al final se convirtió en un “todo vale, si es procedimental”.

Los algoritmos implementados son los siguientes:

  • Generación basada en autómatas celulares. En este algoritmo, tras inicializar el mapa (típicamente con un generador de ruido) el estado de una casilla del mapa en una pasada concreta del mismo se calcula a partir del estado de las casillas vecinas. Este es el algoritmo que puede verse en acción en el gif de arriba.
  • Generación basada en recorridos aleatorios (en concreto, el conocido como el Drunkard Walk, o “Caminata del borracho”). En este caso, a partir de una posición inicial, un agente va moviéndose por el mapa, “excavando” casillas hasta rellenar un porcentaje.
  • Generación de mazmorras con salas rectangulares a partir del algoritmo de particionamiento binario del espacio (más conocido por el acrónimo en inglés BSP, de Binary Space Partitioning). Como su propio nombre indica, en este caso el espacio disponible se va dividiendo en dos sucesivamente, generando un árbol binario. Cuando las dimensiones de las particiones cumplen unas características, terminamos de segmentar y colocamos una “sala”.

El reto en sí me pareció muy entretenido, y para rematarlo lo habría combinado con otros sistemas para ubicar entidades en el mapa, desde puertas a items, trampas o enemigos.

Tecnología: SFML (C++)  e ImGUI para la interfaz de configuración y selección de algoritmos.

Conclusiones

Por ser la primera vez, y al no tener del todo claro la acogida que tendría, el reto quedó bastante circunscrito a la división de programación de FemDevs y tuvo reducida difusión externa.

Debido a esto la participación fue baja en términos absolutos (algunas programadoras más que habían comenzado el reto no pudieron llegar a presentarlo al final), pero relativamente buena en cuanto a la proporción de chicas que habían participado en la votación de temas y el interés suscitado en las conversaciones de la comunidad.

Es de esperar que a medida que se vaya mejorando en la organización del reto y la difusión del mismo se produzca un efecto llamada que atraiga a más gente, o que motive a las participantes a llevar los retos más allá de los eventos en sí.

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s