Quiero generar aleatoriamente un mapa para un juego de desplazamiento lateral en 2D usando el siguiente conjunto de fichas:
He encontrado algunos excelentes artículos sobre el proceso de enmascaramiento de bits, por ejemplo: http://www.angryfishstudios.com/2011/04/adventures-in-bitmasking/ http://www.saltgames.com/2010/a-bitwise -metodo-para-aplicar-tilemaps /
Me gusta la idea de usar una máscara de bits / máscara de mosaico en lugar de hacer una gran cláusula if o una declaración de cambio.
Sin embargo, tengo problemas para visualizar todo el proceso y ninguno de estos artículos habla sobre aleatorización.
Mis mosaicos se unen de múltiples maneras diferentes, no solo de una manera como parecen los mosaicos en los ejemplos que vinculé.
Por ejemplo, aquí hay algunos ejemplos:
Como mis mosaicos se unen de muchas maneras diferentes, no creo que una máscara de 8 bits funcione. Por lo tanto, estaba pensando en usar una máscara de bits más grande. Algo como char [8] o char 4 .
Si alguien pudiera mostrar algunos pseudocódigo / ejemplos de cómo se vería el algoritmo general, lo agradecería enormemente.
¿Ha considerado usar una función de ruido 1D Perlin o simplex? Hay una serie de ventajas para esto, que incluyen:
Infinito (dentro del ámbito de la precisión de punto flotante), terreno no repetitivo
Puede generarse en tiempo real (incluso en un sombreador, que es rápido ), o con anticipación y almacenarse en texturas, como en su ejemplo
Las fronteras coinciden automáticamente ya que tanto Perlin como simplex son continuos.
Aunque el terreno en sí es pseudoaleatorio, es bastante fácil aplicar una función de envolvente o simplemente reducir el número de octavas en áreas donde necesita áreas planas u otras características específicas del terreno que necesita.
Consulte este enlace para obtener una explicación bastante completa de la implementación de 1D Perlin.
Una envolvente es básicamente un campo escalar o una función que se multiplica con la función de ruido antes de guardar o mostrar su salida.
(Imagen inicial tomada del artículo mencionado anteriormente).
En este ejemplo, la línea roja representa una función por partes definida como
... que puede definirse mejor usando una función suave. En este caso, simplemente reduce las cosas a 0 antes de la meseta, luego vuelve a subir a 1 después.
Actualizar
Aquí hay un ejemplo de un "terreno" 3D simplex de uno de mis proyectos, con iluminación difusa + especular aplicada, generada completamente dentro de un tubo sombreador de vert + tess + frag. Para su situación, tomaría un corte vertical de esto para obtener la pendiente del terreno.
Y una vista ortográfica de arriba hacia abajo:
fuente