¿Cómo puedo generar aleatoriamente un terreno de desplazamiento lateral basado en mosaicos 2D?

11

Quiero generar aleatoriamente un mapa para un juego de desplazamiento lateral en 2D usando el siguiente conjunto de fichas: ingrese la descripción de la imagen aquí

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:

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

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.

erebel55
fuente

Respuestas:

3

Sí, el tamaño de la máscara crecería con un número creciente de opciones: su propio enlace http://www.saltgames.com/2010/a-bitwise-method-for-applying-tilemaps/ segunda parte explica la idea principal.

En esencia, tendría que enumerar X posibilidades para cada 'borde' entre los mosaicos; en su ejemplo particular, parece que el "mosaico superior / inferior" puede estar (1) blanco (2) cubierto o (3) semicubierto, lo que coincide casualmente con el ejemplo 'trinario' dado en el artículo.

Pero las máscaras solo lo ayudarían a restringir las posibilidades de mosaico a las que se pueden dibujar, en sí mismo no es un método que muestre cómo generar los mapas reales de una manera sensata.

Su conjunto de fichas en particular es bastante restrictivo: describe solo una sola superficie que sube / baja, y en cualquier punto de partida de 'nivel entero' tiene solo unas pocas opciones válidas. Por ejemplo, después del mosaico # 2 solo son posibles los mosaicos # 1 u # 8. Simplemente puede moverse de izquierda a derecha, haciendo una lista de qué (pocos) mosaicos pueden aparecer después del mosaico anterior y eligiendo aleatoriamente uno de ellos.

Pedro es
fuente
Creo que esta es la respuesta que estoy buscando, sin embargo, todavía está un poco nublado. ¿Puede obtener un poco más de detalle, ya sea en texto o pseudocódigo sobre cómo funcionaría la última parte de su explicación? "Podrías simplemente moverte de izquierda a derecha, haciendo una lista de qué (pocas) fichas pueden aparecer después de la ficha anterior, y eligiendo aleatoriamente una de ellas".
erebel55
1
Para cada tipo de mosaico, tenga una lista de los mosaicos permitidos después de eso: hay tan pocos mosaicos que se pueden hacer rápidamente de forma manual. La 'altura' cambiará, llene todo debajo del nuevo mosaico con # 10.
Peteris
Ah, ¿entonces estás diciendo que uses este método en lugar de la máscara de bits?
erebel55
1
Sí, el enmascaramiento de bits es útil si todo el contenido 2D es significativo, pero sus mapas parecen ser de un solo nivel, una superficie horizontal de altura variable.
Peteris
Eso tiene sentido, las "montañas" serán de diferentes alturas y fluirán entre sí. Así que esencialmente será una montaña continua que cambia de altura a medida que avanzas. Algo así como una onda cosenoidal / senoidal que tiene magnitudes aleatorias en diferentes puntos. ¿Debo moverme de izquierda a derecha o de arriba a abajo al generar el mapa?
erebel55
6

¿Ha considerado usar una función de ruido 1D Perlin o simplex? Hay una serie de ventajas para esto, que incluyen:

  1. Infinito (dentro del ámbito de la precisión de punto flotante), terreno no repetitivo

  2. 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

  3. Las fronteras coinciden automáticamente ya que tanto Perlin como simplex son continuos.

  4. 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.

ingrese la descripción de la imagen aquí

(Imagen inicial tomada del artículo mencionado anteriormente).

En este ejemplo, la línea roja representa una función por partes definida como

x < 0.3 : y = (0.3-x)/0.3)
x < 0.5 : 0
x < 0.7 : (x - 0.5) / 0.2
else    : 1

... 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.

ingrese la descripción de la imagen aquí

Y una vista ortográfica de arriba hacia abajo:

ingrese la descripción de la imagen aquí

3Dave
fuente
¿Esta es una técnica para generar las imágenes de mosaico reales?
erebel55
1
@ erebel55 Sí. Puede usar una función 2D para decidir dónde (según su ejemplo) colocar diferentes hijos de plantas dentro de la imagen, y también para generar el terreno inclinado. He usado esto en 3D con excelentes resultados.
3Dave
Parece un método interesante, simplemente no estoy seguro de querer seguir este camino ya que ya tengo mis imágenes creadas.
erebel55
@ erebel55 sí, no hay razón para tirar cosas existentes si está funcionando para ti.
3Dave
Bueno, todavía no tengo la generación aleatoria funcionando, pero espero;) Le di un voto positivo para este método, ya que fue interesante y podría usarlo en algún momento en el futuro. Gracias
erebel55