Generación aleatoria de mapas

63

Estoy comenzando / empecé un juego RPG de mosaico 2D en Java y quiero implementar la generación de mapas aleatorios. Tengo una lista de diferentes mosaicos (tierra / arena / piedra / hierba / grava, etc.) junto con mosaicos de agua y mosaicos de caminos, el problema que tengo es que no tengo idea de dónde comenzar a generar un mapa al azar.

Tendría que tener secciones de terreno (como una parte de ella será arena, parte de tierra, etc.) Similar a cómo Minecraft es donde tienes diferentes biomas y se transforman sin problemas entre sí. Por último, también necesitaría agregar rutas aleatorias en esto, así como ir en diferentes direcciones en todo el mapa.

No le estoy pidiendo a nadie que me escriba todo el código ni nada, solo póngame en la dirección correcta, por favor.

tl; dr: genera un mapa de mosaico con biomas, caminos y asegúrate de que los biomas se unan perfectamente entre sí.

Tom O
fuente

Respuestas:

68

Entre las muchas otras preguntas relacionadas en el sitio, hay un artículo a menudo vinculado para la generación de mapas: Generación de mapas poligonales para juegos , puede obtener algunas buenas estrategias de ese artículo, pero en realidad no se puede usar como está.

Si bien no es un tutorial, hay un artículo sobre cómo se generan los mapas mundiales de fortaleza enana. Básicamente, genera múltiples capas de ruido, para altura, humedad, temperatura, salinidad. Entonces usarías algo como esto:

ingrese la descripción de la imagen aquí

O esto

ingrese la descripción de la imagen aquí

para generar biomas en función de las capas de ruido que produjo antes. Normalmente, esto proporciona una transición bastante suave entre los biomas y las transiciones son lógicas. También modifico los mapas de humedad y temperatura según la elevación. Esto, naturalmente, genera una "línea de madera" y produce montañas rocosas con casquetes nevados.

Estoy usando esta estrategia en mi juego y produce mapas como este muy rápidamente:

ingrese la descripción de la imagen aquí

Además, puedes verme desplazarme por algunos mapas más al comienzo de este video .

Y aquí hay más para comenzar:

¿Cómo puedo crear un "mundo" aleatorio en un motor de mosaico?

¿Cómo puedo identificar regiones de características en un mundo generado por procedimientos?

¿Cómo creo un ruido sólido enlosable para la generación de mapas?

MichaelHouse
fuente
Si bien el enlace de Generación de mapas poligonales para juegos es un artículo muy bueno, no creo que sea muy adecuado para esta pregunta porque a) no es una cuadrícula de mapa de mosaicos yb) no tiene biomas: la textura del terreno es basado en la altura.
Tapio
@Tapio Tienes razón, he actualizado con más información.
MichaelHouse
@ Byte56 ¡Gracias, todo esto me da un punto de partida! :)
Tom O
@ Byte56 ¡Noté que mencionaste mi pregunta de hace un par de años, así que la actualicé con un código de trabajo!
Nick Badal
1
Por cierto, el proyecto de generación de mapas poligonales se realizó para un juego que tenía un mapa de mosaico que no mostraba las alturas. Las alturas y los polígonos están ahí para generar los biomas, pero en realidad no se muestran en el juego.
amitp
29

Mientras que las otras respuestas aquí son realmente buenas para generar los tipos de paisajes estáticos que funcionarían para esta necesidad específica. Hay otros métodos que las personas que se encuentran con esta pregunta podrían estar buscando si desean crear paisajes que cambien con el tiempo o parezcan mucho más realistas, puede seguir esta técnica.

A diferencia de las otras respuestas, comienzas esto con un mapa completamente vacío. Comience con lo que consideraría ser el nivel del mar. Use el ruido Perlin para agregar una variación muy leve, si tiene 256 elevaciones posibles, no varíe más de 3-5 en cualquier dirección. Esto construye los primeros miles de millones de años de su paisaje sin tener que ejecutar una simulación durante tanto tiempo.

Placas tectónicas

Divida el mapa a lo largo de líneas rectas o curvas para crear placas, cuanto más detalladas sean las formas de las placas, más interesante será su paisaje. Mantenlos grandes. Dale a cada plato una dirección, velocidad. Durante un período de tiempo determinado, mueva las placas de forma escalonada alrededor del mapa, arrastrando todas las fichas sobre ellas con ellas.

Cuando se cruzan dos placas, elija cuál pasará y cuál se hundirá, esta elección puede ser aleatoria. Las baldosas en las placas designadas debajo se reducen instantáneamente en altura en 5 pasos. Una vez que se ha designado una placa encima o debajo, todas las interacciones futuras con placas seguirán estas reglas:

  • Cuando una placa designada cruza una placa no designada, la placa no designada se convierte en el tipo opuesto. (Por lo tanto, las placas UD se vuelven inferiores cuando se cruzan por encima).
  • Cuando una placa superior se asienta sobre una placa inferior, todas esas fichas suben 0-1 escalones de elevación, y las fichas siguen el camino de la placa superior.
  • Cuando una placa superior cruza una placa superior, todas esas fichas suben 1-2 pasos, y las fichas en la región de cruce ya no se desplazan.
  • Cuando una placa inferior cruza una placa inferior, cualquier mosaico en el área con una elevación mayor que la marca del 66% para ambas placas en la región cruzada se mueve de 1 a 3 pasos (como por actividad volcánica, esto producirá islas durante el tiempo suficiente ) y las fichas en esta área dejan de ir a la deriva.

Todas las placas que cruzan se ralentizan en un 20% de su velocidad actual en cada paso. Para mayor realismo, agregue un cambio aleatorio de -10% a 10% en la dirección del movimiento en cada paso.

Después de realizar el número deseado de pasos. Probablemente 5-10 son suficientes. Cualquier mosaico en el que no haya placas residentes debe dejarse caer al nivel más bajo existente.

¿Grande o pequeño?

Este mapa se puede usar como está o se puede expandir para crear un mapa mucho más grande al dividirlo en bloques de 4X4 mosaicos (celdas) y expandir esas secciones en función de sus elevaciones individuales. Trate la elevación de cada celda como un punto y cree una gradación suave en el mapa más grande entre esos puntos. Entonces, si el mapa más grande es 40X40 en lugar de 4X4, y el punto (0,0) era 10 y el punto (0,1) era 1, los mosaicos en el mapa más grande entre ellos serían 10,9,8,7,6 , 5,4,3,2,1 de altura. Se puede agregar más ruido de Perlin para suavizar las pendientes. Sobre todo, esta técnica de escala es similar al algoritmo Diamond Square .

Agua

Para simular ríos y lagos, océanos y capas freáticas. Prefiero usar autómatas celulares .

Las alturas se convierten en flotadores o rangos int expandidos para permitir un seguimiento de grano más fino. Las células de agua tienen valores de saturación, digamos en el rango de 1-256. Los mapas deben comenzar de manera uniforme. Tendrás que jugar con los números para tus tamaños de mapa individuales, sin embargo, en general, seguirás reglas como esta:

  • Si una celda vecina está más saturada, aumente la saturación y gane altura.
  • Si una celda vecina está menos saturada, disminuya la saturación y pierda altura.

Haga esta verificación para cada celda vecina. Ejecute una cantidad suficiente de pasos. Si lo desea, puede agregar temperatura a esta simulación cambiando la cantidad de saturación perdida / ganada por esa temperatura. También puede cambiarlo según la elevación. Se deben formar lagos y ríos naturales. Algunos caerán al océano. (El océano probablemente no se llenará por ninguna métrica, pero de todos modos designarás cualquier cosa debajo del nivel del mar para que se llene de agua al final).

Puede mantener los datos de temperatura y saturación para usar, como en las otras respuestas, para crear biomas. Deberían ser MUCHO más precisos e interesantes. Con biomas nevados en los polos y calientes en el medio (si usa una lista gradual de temperaturas suave).

También puede simular el viento y, por lo tanto, los cambios de temperatura en función de las elevaciones. Si lo desea, puede avanzar y retroceder entre la simulación de temperatura y la simulación de agua. Sin embargo, no he construido nada con los cambios de temperatura, por lo que no comentaré cómo hacerlo.

Paisajes en evolución

Si mantiene las simulaciones de tierra, agua y calor y reduce drásticamente sus efectos y también evita que las placas se muevan, puede continuar cambiando todas estas métricas con el tiempo. No ejecutaba los cálculos muy a menudo, pero puede obtener un mapa mundial que responda a los cambios de esta manera.

Conclusión

Si bien este tipo de técnicas son mucho más complicadas, producen efectos mucho más realistas y evolutivos. Tómelo por lo que vale?

DampeS8N
fuente
15

Puedes usar Perlin Noise para la generación del terreno, así es como funcionan los biomas en Minecraft. Como puede ver, él usa un mapa de calor en combinación con un mapa de lluvia para crear los biomas.

Biomas de Minecraft

tversteeg
fuente