versiones guia español descargar actualizar algorithm 2d tile procedural-generation

algorithm - guia - Generación de mapa de mosaico 2D



qgis manual (2)

Estoy desarrollando un motor de mosaico 2D y en este momento estoy trabajando en algoritmos de generación de mapas.

Probé los básicos, usualmente involucrados en la generación de mapas de altura simples como

  • generación de la colina
  • ruido perlin
  • cuadrado de diamante

pero siempre tengo el mismo problema: este tipo de algoritmos parece adecuado cuando se trata de mapas de mosaicos que también tienen un componente de altura, pero este no es mi caso.

Básicamente tengo sprites como la hierba, el mar, el desierto, etc., pero no deben colocarse dentro del mapa de acuerdo con una altura generada sino algo así como

  • todo comienza desde el océano
  • las islas se colocan en el centro del mapa (aquí es donde los algoritmos que probé fallaron en su mayoría)
  • Se generan desiertos (deberían ser como manchas al azar alrededor)
  • Se generan cadenas de montañas y colinas (deben ser como serpientes)

¿Qué tipo de enfoque debo probar?

Resolví los problemas de los subcomponentes (como desiertos, colinas y montañas) mediante el desarrollo de algoritmos especializados para hacer lo que necesitaba (por ejemplo, las montañas comienzan desde un punto y luego siguen una dirección con posibilidad de girar), pero estoy fallando en la generación de las islas básicas (que pueden ser personalizables para ser solo una pangea o muchos grados de tamaño).

Solo para darte una idea práctica, lo que busco es algo como el algoritmo de civilización:


[generación de colina, perlin, cuadrado de diamante] ... este tipo de algoritmos parece adecuado cuando se trata de mapas de mosaicos que también tienen un componente de altura, pero este no es mi caso.

Pero es tu caso. Las montañas son más altas que las llanuras, y las llanuras son más altas que el agua.

___/ ___/ ___ Mountain cutoff ___/ ______/ ____/ ___ Water cutoff __/

Puede cuantificar sus datos de modo que si se encuentra entre un conjunto de niveles, se cuenta como un tipo de mosaico, mientras que cuando se encuentra en un rango diferente, es un tipo diferente de mosaico. Desechará algunos detalles, pero seguirá obteniendo perfiles que coincidan con el tipo de ruido que está generando.

Probablemente tomará una buena cantidad de ajustes, y requerirá que genere otras características de terreno (además de las montañas intransitables), pero tendrá que modificar mucho con cualquier solución de generación de contenido.


Utilicé un enfoque al que otros se han referido como el uso de "hormigas" para crear el terreno aleatorio. Una descripción del enfoque utilizado:

Primero, generé un tilemap usando una matriz rectangular de dos dimensiones (x, y) de una clase de mosaico especializada. La clase de mosaico contiene información relacionada con el mosaico, como el punto de atracción y el tipo de terreno.

Luego creé una clase especial de "hormigas", que se puede considerar como una entidad invisible que da "pasos" alrededor del tilemap. Cada vez que la hormiga se mueve a una nueva ficha, se cambia el tipo de terreno subyacente. La hormiga puede moverse en 8 direcciones y cambia de dirección, cada vez que mueve una ficha. La dirección que toma después de cada paso es aleatoria.

Generé una cantidad fija o aleatoria de hormigas con una cantidad fija o aleatoria de vida. La vida útil es la cantidad de mosaicos que puede atravesar / avanzar antes de que se eliminen.

Para poder controlar qué tipo de terreno es el más común, creo una matriz de "tipo de terreno". Esta matriz contiene una lista de los tipos de terreno (básicamente solo un int). Para obtener el mismo equilibrio entre todos los tipos de terreno, agregue solo uno de cada tipo de terreno a la matriz de tipo de terreno. Si quisiera que un determinado tipo de terreno fuera más común, agregaría más entradas a la matriz, con ese tipo de terreno en particular.

Luego, cuando la hormiga necesita determinar qué terreno cambiar, realiza una búsqueda en la matriz de tipo de terreno utilizando un entero aleatorio como índice de matriz.

Se necesitan algunos ajustes para modificar los parámetros (cantidad de hormigas, tiempo de vida de la hormiga, tipo de terreno), pero hasta ahora estoy logrando algunos terrenos realmente buenos.

Se podría mejorar aún más mediante el uso de tipos más sofisticados de clases de hormigas, que, por ejemplo, atravesaron patrones especializados, etc. manera de moverse (para que no obtengas aleatoriamente "picos" de tierra, islas pequeñas muy dispersas, etc.).

El siguiente es un ejemplo de mapa de un bosque, que se genera de manera procesal por una pequeña aplicación que hice utilizando el enfoque de hormigas. Espero que esto pueda ponerte en camino!

Puede obtener la fuente de la aplicación (VB.NET) en Github