Unlimited WordPress themes, graphics, videos & courses! Unlimited asset downloads! From $16.50/m
Advertisement
  1. Game Development
  2. Procedural Content Generation
Gamedevelopment

Crear un sistema de cueva de mazmorra generado procesalmente

by
Difficulty:IntermediateLength:LongLanguages:

Spanish (Español) translation by Elías Nicolás (you can also view the original English article)

Para muchos, la generación de procedimientos es un concepto mágico que está fuera de su alcance. Solo los desarrolladores veteranos de juegos saben cómo crear un juego que pueda crear sus propios niveles ... ¿verdad? Puede parecer mágico, pero los desarrolladores de juegos para principiantes pueden aprender PCG (generación de contenido de procedimientos). En este tutorial, te mostraré cómo generar procesalmente un sistema de calabozo.


Lo que vamos a cubrir

Aquí hay una demostración de SWF que muestra el tipo de diseños de nivel que esta técnica puede generar:


Haga clic en el SWF para generar un nuevo nivel.

Aprender los conceptos básicos generalmente significa mucha búsqueda y experimentación con Google. El problema es que hay muy pocas guías simples sobre cómo comenzar. Como referencia, aquí hay algunas excelentes fuentes de información sobre el tema, que he estudiado:

Antes de entrar en detalles, es una buena idea considerar cómo vamos a resolver el problema. Aquí hay algunos trozos fáciles de digerir que usaremos para mantener esto simple:

  1. Coloca aleatoriamente tu contenido creado en el mundo del juego.
  2. Verifique que el contenido esté ubicado en un lugar que tenga sentido.
  3. Verifica que tu contenido sea alcanzable por el jugador.
  4. Repita estos pasos hasta que su nivel se una muy bien.

Una vez que hayamos trabajado en los siguientes ejemplos, deberías tener las habilidades necesarias para experimentar con PCG en tus propios juegos. Emocionante, ¿eh?


¿Dónde colocamos nuestro contenido del juego?

Lo primero que vamos a hacer es colocar aleatoriamente las salas de un nivel de mazmorra generado por procedimiento.

Para poder seguir, es una buena idea tener una comprensión básica de cómo funcionan los mapas de mosaicos. En caso de que necesite una descripción general rápida o una actualización, consulte este tutorial de mapas de mosaicos. (Está orientado a Flash pero, incluso si no está familiarizado con Flash, sigue siendo bueno para obtener la esencia de los mapas de mosaicos).

Creando una habitación para colocar en tu nivel de mazmorra

Antes de comenzar tenemos que llenar nuestro mapa de azulejos con azulejos de la pared. Todo lo que necesita hacer es iterar a través de cada punto en su mapa (una matriz 2D, idealmente) y colocar el mosaico.

También necesitamos convertir las coordenadas de píxeles de cada rectángulo a nuestras coordenadas de cuadrícula. Si desea pasar de píxeles a la ubicación de la cuadrícula, divida la coordenada de píxeles por el ancho del mosaico. Para pasar de la cuadrícula a los píxeles, multiplique la coordenada de la cuadrícula por el ancho del mosaico.

Por ejemplo, si queremos ubicar la esquina superior izquierda de nuestra habitación en (5, 8) en nuestra cuadrícula y tenemos un ancho de mosaico de 8 píxeles, tendríamos que colocar esa esquina en (5 * 8, 8 * 8) o (40, 64) en coordenadas de píxel.

Vamos a crear una clase Room; podría verse así en el código Haxe:

Tenemos valores para el ancho, la altura, la posición del punto central y las posiciones de las cuatro esquinas de cada habitación, y una función que nos dice si este cuarto se cruza con otro. También tenga en cuenta que todo, excepto los valores xey, están en nuestro sistema de coordenadas de cuadrícula. Esto se debe a que hace que sea mucho más fácil usar números pequeños cada vez que accedemos a los valores de la habitación.

De acuerdo, tenemos el marco para una habitación en su lugar. ¿Ahora cómo generamos y colocamos un espacio en el procedimiento? Bueno, gracias a los generadores de números aleatorios incorporados, esta parte no es demasiado difícil.

Todo lo que tenemos que hacer es proporcionar valores aleatorios de x e y para nuestra sala dentro de los límites del mapa, y dar valores aleatorios de ancho y altura dentro de un rango predeterminado.

procedural-content-room-placement

¿Tiene sentido nuestra ubicación aleatoria?

Dado que estamos utilizando ubicaciones y dimensiones aleatorias para nuestras habitaciones, estamos obligados a solaparnos con las habitaciones creadas previamente a medida que llenamos nuestra mazmorra. Bueno, ya codificamos un método simple intersects() para ayudarnos a resolver el problema.

Cada vez que intentamos colocar una nueva sala, simplemente llamamos a intersects() en cada par de habitaciones dentro de la lista completa. Esta función devuelve un valor booleano: true si las salas se superponen, y de lo contrario es false. Podemos usar ese valor para decidir qué hacer con la habitación que intentamos ubicar.

procedural-content-intersection-diagram
Vuelva a verificar en la función intersects(). Puede ver cómo los valores x e y se superponen y devuelven true.

La clave aquí es el booleano failed; se establece en el valor de retorno de intersects(), y así es true si (y solo si) sus salas se superponen. Una vez que salimos del ciclo, verificamos esta variable failed y, si es falsa, podemos crear la nueva sala. De lo contrario, simplemente descartamos la sala e intentamos de nuevo hasta que hayamos alcanzado nuestro número máximo de habitaciones.


¿Cómo debemos manejar el contenido inalcanzable?

La gran mayoría de los juegos que usan contenido generado por procedimientos se esfuerzan por hacer que el jugador alcance todo ese contenido, pero hay algunas personas que creen que esta no es necesariamente la mejor decisión de diseño. ¿Qué pasa si tienes algunas habitaciones en tu mazmorra que el jugador rara vez puede llegar pero que siempre puede ver? Esto podría agregar una dinámica interesante a su mazmorra.

Por supuesto, no importa de qué lado del argumento esté, probablemente sea una buena idea asegurarse de que el jugador siempre pueda progresar en el juego. Sería bastante frustrante si alcanzas el nivel de mazmorra del juego y la salida queda bloqueada por completo.

Teniendo en cuenta que la mayoría de los juegos tienen un contenido 100% alcanzable, nos quedaremos con eso.

Vamos a manejar esa accesibilidad

Por ahora, debe tener un mapa de mosaicos en funcionamiento y debe haber un código en su lugar para crear un número variable de salas de diferentes tamaños. Mira eso; ¡ya tienes salas de calabozos ingeniosas generadas por procedimientos!

Ahora el objetivo es conectar cada habitación para que podamos caminar a través de nuestra mazmorra y, finalmente, llegar a una salida que conduce al siguiente nivel. Podemos lograr esto esculpiendo corredores entre las habitaciones.

Necesitaremos agregar una variable point al código para hacer un seguimiento del centro de cada habitación creada. Cada vez que creamos y colocamos una habitación, determinamos su centro y lo conectamos al centro de la habitación anterior.

Primero, implementaremos los corredores:

Estas funciones actúan casi de la misma manera, pero una se esculpe horizontalmente y la otra verticalmente.

procedural-content-corridor-diagram-1

La conexión de la primera sala a la segunda sala requiere un vCorridor y un hCorridor.

Necesitamos tres valores para hacer esto. Para los corredores horizontales, necesitamos el valor x de inicio, el valor x de finalización y el valor y actual. Para los corredores verticales necesitamos los valores y de inicio y finalización junto con el valor x actual.

Como nos movemos de izquierda a derecha, necesitamos los dos valores x correspondientes, pero solo un valor y, ya que no nos moveremos hacia arriba o hacia abajo. Cuando nos movemos verticalmente necesitaremos los valores y. En el bucle for al comienzo de cada función, iteramos desde el valor inicial (x o y) hasta el valor final hasta que hayamos esculpido todo el corredor.

Ahora que tenemos el código de corredor en su lugar, podemos cambiar nuestra función placeRooms() y llamar a nuestras nuevas funciones de corredor:

procedural-content-corridor-diagram-2

En la imagen de arriba, puede seguir la creación del corredor desde la primera a la cuarta habitación: rojo, verde y azul. Puede obtener resultados interesantes según la ubicación de las habitaciones; por ejemplo, dos pasillos uno al lado del otro forman un corredor de doble ancho.

Agregamos algunas variables para rastrear el centro de cada habitación y adjuntamos las habitaciones con corredores entre sus centros. Ahora hay múltiples salas y corredores que no se superponen y que mantienen conectado todo el nivel de mazmorra. No está mal.

procedural-content-room-connection

Hemos terminado con nuestra mazmorra, ¿verdad?

Has recorrido un largo camino construyendo tu primer nivel de mazmorra generado por procedimientos, y espero que te hayas dado cuenta de que PCG no es una bestia mágica que nunca tendrás la oportunidad de matar.

Examinamos cómo colocar aleatoriamente el contenido en torno a su nivel de mazmorra con generadores de números aleatorios simples y unos pocos rangos predeterminados para mantener su contenido del tamaño correcto y más o menos en el lugar correcto. A continuación, descubrimos una forma muy sencilla de determinar si su ubicación aleatoria tenía sentido al buscar salas superpuestas. Por último, hablamos un poco acerca de los méritos de mantener su contenido accesible y encontramos una manera de garantizar que su jugador pueda llegar a todas las habitaciones de su mazmorra.

Los primeros tres pasos de nuestro proceso de cuatro pasos han finalizado, lo que significa que tienes los cimientos de una gran mazmorra para tu próximo juego. El último paso depende de usted: debe repetir lo que aprendió para crear contenido generado más procesalmente para una rejugabilidad infinita.

Siempre hay más para aprender

El método para crear niveles de mazmorras simples en este tutorial solo araña la superficie de PCG y hay algunos otros algoritmos simples que puedes recoger fácilmente.

Mi desafío para ti es comenzar a experimentar con los inicios de tu juego que creaste aquí y buscar más métodos para cambiar tus mazmorras.

Un gran método para crear niveles de cavernas es utilizar un autómata celular, que tiene infinitas posibilidades para personalizar los niveles de mazmorra. Otro gran método para aprender es el Particionamiento del Espacio Binario (BSP), que crea algunos niveles de mazmorra de aspecto reticulado.

Espero que esto te haya dado un buen comienzo en la generación de contenido de procedimientos. Asegúrese de comentar a continuación con cualquier pregunta que tenga, y me encantaría ver algunos ejemplos de lo que está creando con PCG.

Advertisement
Advertisement
Advertisement
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.