2011-01-16 15 views
25

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

Me trataron los básicos normalmente involucrados en la generación de alturas simple como

  • generación colina
  • ruido Perlin
  • diamante cuadrado

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

básicamente tienen sprites como la hierba, mar, desierto y así sucesivamente, pero que no deben ser colocados dentro del mapa de acuerdo a una altura generada sino algo así como

  • todo empieza a partir del océano
  • islas son colocado en el centro del mapa (aquí es donde algoritmos que he intentado fracasaron en su mayoría)
  • desierto se generan (que deberían ser como lugares al azar alrededor)
  • montaña y colinas cadenas se generan (que deberían ser como las serpientes)

¿Qué tipo de enfoque debo probar?

Resolví los problemas del subcomponente (como desiertos, colinas y montañas) desarrollando algoritmos especializados para hacer lo que necesitaba (por ejemplo, montaña comienza desde un punto y luego sigue una dirección con la posibilidad de girar) pero estoy fallando con la generación de las islas básicas (que pueden ser personalizables para ser simplemente pangea o muchos grados de tamaño).

Sólo para dar una idea práctica lo que estoy buscando es algo así como el algoritmo de la civilización:

alt text

+1

En el momento de pedir, no creo que esto existía. Hoy en día, existe http://gamedev.stackexchange.com/ – Hooked

Respuesta

14

[generación colina, Perlin, cuadrado 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 su 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 los datos de modo que si es entre un conjunto de niveles, se cuenta como un tipo de azulejo, mientras que cuando se encuentra en un rango diferente, es un tipo diferente de baldosas. Estarás arrojando algunos detalles, pero aún obtendrás contornos que coincidan con el tipo de ruido que estás generando.

Probablemente requieras una buena cantidad de ajustes, y requerirás que generes otras características de la tierra (además de las montañas impenetrables), pero tendrás que ajustar mucho con cualquier solución de generación de contenido.

+6

. Si desea más información sobre algoritmos de generación de contenido de procedimientos, técnicas, experiencias, etc., recientemente [encontré esta página wiki] (http://pcg.wikidot.com/category-pcg-algorithms). Parece un gran recurso y cubre los algoritmos de hightmap que mencionaste en tu pregunta. No es mi sitio, ni estoy involucrado con ellos de ninguna manera, simplemente parece increíble, así que quería conectarlo :) –

15

Utilicé un enfoque que otros han denominado "hormigas" para crear el terreno aleatorio.Una descripción del enfoque utilizado:

Primero, he generado un mapa de mosaicos utilizando una matriz rectangular bidimensional (x, y) de una clase de mosaico especializado. La clase de mosaico contiene información relacionada con el mosaico, como el punto de dibujo y el tipo de terreno.

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

Provoco una cantidad fija o aleatoria de hormigas con una cantidad de vida fija o aleatoria. Lifetime es la cantidad de mosaicos que puede atravesar/pisar antes de ser eliminado.

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, solo agrega uno de cada tipo de terreno a la matriz de tipo de terreno. Si desea que un cierto tipo de terreno sea más común, agregará más entradas a la matriz, con ese tipo de terreno en particular.

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

Toma un poco de ajustar los parámetros (cantidad de hormigas, vida de hormigas, tipo de terreno matriz), pero estoy logrando algunos terrenos realmente buenos hasta el momento.

Podría mejorarse aún más mediante el uso de tipos más sofisticados de clases de hormigas, que por ejemplo atravesadas en patrones especializados, etc. Para crear islas creíbles en un océano, es probable que desee modificar el comportamiento de las hormigas para que tengan algunas limitaciones en términos de qué camino mover (para que no se obtengan al azar "picos" largos de tierra, islas pequeñas muy dispersas, etc.).

A continuación se muestra un ejemplo de mapa de mosaico de un bosque, que se genera procesalmente mediante una pequeña aplicación que hice usando el enfoque de hormiga. Espero que esto te ponga en camino!

Usted puede obtener el código fuente de la aplicación (VB.NET) en Github

Procedurally generated 2D tile map of a forest section

+1

+1; Este es un enfoque interesante, algo similar a [Cellular Automata] (http://pcg.wikidot.com/pcg-algorithm:cellular-automata). Parece que básicamente obtendrías una distribución aleatoria con agrupación, lo que a primera vista parece lo que querrías. No creo que sea probable obtener gradientes suaves con este enfoque, especialmente si se compara con el ruido de Perlin, aunque creo que podría ser mucho más convincente para ciertos tipos de mosaicos (por ejemplo, árboles). En cuanto a su "tabla de números", esto es similar a mi respuesta para [cómo ponderar un PRNG] (http://stackoverflow.com/questions/3966809). –

Cuestiones relacionadas