Forma correcta de generar "al azar" terreno fluido

9

Estoy creando un juego RTS de arriba hacia abajo simple. Planeo hacerlo "al azar" generando mapas sobre la marcha cuando sea necesario. Planeo que todo funcione en 'pases':

  1. Rellene el terreno con toda la hierba
  2. Regrese y agregue algunos chorros de grava al azar
  3. Redondea la grava
  4. Dibujar paisaje de montaña en la segunda capa
  5. Redondea montañas
  6. etcétera etcétera.

Ahora, eche un vistazo a esta imagen a continuación:

ingrese la descripción de la imagen aquí

Creé esto a mano usando mi editor de mapas, pero planeo que este sea básicamente el resultado después de pasar el paso 3.

¿Cómo debo decidir cuándo y dónde colocar mi grava para que tenga al menos una forma irregular y sea lo suficientemente esporádica como para parecer natural?

Gracias si puedes! ¡Cualquier ayuda es apreciada!

Como nota al margen:

Cada pase es básicamente yo iterando a través de todos mis mosaicos (El mapa está dividido en 40x40 mosaicos) similar a esto:

for (int x = 0; x <= GRIDMAX - 1; x++) {
    for (int y = 0; y <= GRIDMAX - 1; y++) {
        //Terrain(x, y, 0) = SomethingHere;
    }
}
Freesnöw
fuente

Respuestas:

5

Puede jugar con Perlin Noise ( vea mi respuesta StackOverflow para una implementación ), para generar un mapa de altura. Desde el mapa de altura, puede asignar ciertos rangos de altura a diferentes mosaicos. Algo como:

  • Top 20% nieve
  • Siguiente 20% de grava
  • Siguiente 40% de hierba
  • Último 20% de agua

Tendrás que jugar con los valores del generador de ruido Perlin para obtener un terreno que pueda generarse y verse bien.

Nick Banks
fuente
5

Como han dicho los demás, el ruido perlin debería ser una buena fuente de datos para decidir dónde colocar diferentes tipos de mosaicos. Me gustaría complementar esa idea y vincular dos recursos adicionales que deberían ser útiles con el tercer paso en su lista de verificación: redondear las esquinas .

Este es un proceso llamado auto-mosaico y no es tan difícil de implementar. Hay muchas formas diferentes de hacerlo, pero la mayoría de ellas se basan en el cálculo de información de adyacencia para cada mosaico para decidir qué gráfico se debe dibujar en esa ubicación.

Una manera muy elegante de resolver este problema es asignar un valor de bandera único a cada dirección de mosaico adyacente, y diseñar su spritehseet de tal manera que el valor que obtenga al sumar todas las banderas adyacentes de un mosaico corresponda a la posición correcta del azulejo en la hoja de sprites. Lea este artículo para obtener una descripción muy clara de la técnica.

Y aquí hay otro recurso que describe otra variación de la técnica.

David Gouveia
fuente
Oye, solo para hacerte saber, tu respuesta fue extremadamente útil en lo que respecta a doblar las esquinas. Muchas gracias :) ¡Ahora todo funciona (incluso las esquinas redondeadas)!
Freesnöw
4

Esencialmente, puede utilizar la generación de ruido Perlin para generar sus mapas. Debería muestrear el mapa de altura generado y asignar bloques de grava a partes del mapa que tengan una altura superior a cierta.

Aquí hay una excelente publicación de referencia sobre cómo implementar un sistema de este tipo y los diferentes tipos de terreno que podría generar.

Los ejemplos tienen muchos más pasos de los que necesitaría, pero el concepto es el mismo.

Más sobre Minecraft-type world gen

http://www.gamedev.net/blog/33/entry-2227887-more-on-minecraft-type-world-gen/

ingrese la descripción de la imagen aquí

David Young
fuente