He creado un mapa de altura aleatorio y ahora quiero crear ríos. He creado un algoritmo basado en un * para hacer que los ríos fluyan de los picos al mar y ahora estoy en la búsqueda de encontrar un algoritmo elegante para representarlos.
Es una cuadrícula 2D cuadrada. Las celdas que pasa el río tienen un valor entero simple con esta forma: rivernumber && pointOrder. Es decir: 10, 11, 12, 13, 14, 15, 16 ... 1 + N para el primer río, 20,21,22,23 ... 2 + N para el segundo, etc. Esto se crea en el mapea el tiempo de generación de la cuadrícula y se ejecuta solo una vez, cuando se genera el mundo.
Quería tratar cada río como un vector, pero hay un problema, si el mismo río tiene ramas (porque pongo algo de ruido para generar ramas), no puedo simplemente conectar los puntos en orden.
La segunda alternativa es generar un algoritmo complejo donde analice cada punto, verifique si el siguiente no es una rama, si es así, active otro algoritmo que se encargue de la rama y luego regrese al río principal, etc. Muy complejo e poco elegante.
Quizás haya una solución en el algoritmo de generación mundial o en el algoritmo de representación de río que se usa comúnmente en estos casos y que no conozco.
¿Algun consejo? ¡¡Gracias!!
fuente
Respuestas:
Este tutorial / blog de desarrollo de juegos proporciona un método excelente para generar ríos, y se renderizan muy bien. No estoy seguro de si esto se puede aplicar de manera efectiva en su situación, ya que ha adoptado un enfoque diferente (y tiene un mapa basado en la cuadrícula), pero vale la pena analizarlo, seguro.
fuente
Una cosa que podría hacer es hacer que cada nodo individual se maneje solo. Haga un pase sobre él cuando después de la generación pero antes de mostrar y dé a cada cuadrado del río una lista de entradas (número más bajo, mismo río) y salidas (número más alto, mismo río).
A partir de estos datos, deberías poder averiguar dónde están las entradas y las salidas (almacenar la ubicación relativa probablemente ayudaría) y desde allí puedes representar el río de ese cuadrado en función de las conexiones. La forma más sencilla de hacer una rama es conectar las entradas / salidas al centro de la plaza.
La representación gráfica de esto podría tomarse de muchas maneras diferentes, y usted no ha brindado suficiente información sobre su uso como para recomendarla directamente; así que solo mencionaré una forma que involucra un sistema de partículas donde cada segmento de agua fluye dinámicamente "cuesta abajo".
Haga que el cuadrado raíz comience un número de "piezas de agua" en cada una de sus entradas y haga que decidan al azar de las salidas disponibles en la creación. Cuando llegue a la salida, engendra uno en la baldosa que golpeó la entrada y devuelve la pieza de agua al comienzo de su cuadrado. Como ya se ha generado en el siguiente cuadrado (solo haga esto una vez por pieza en un cuadrado), y ya conoce la configuración y los cálculos (no vuelva a aleatorizar), puede dejar que esta pieza se repita en su cuadrado con muy poco cálculo, y si lo desea, probablemente utilizando un sombreador.
Esto tiene la ventaja de dejar que sus ríos vayan a ríos más pequeños después de las ramas, y los dos ríos resultantes no tienen que ser del mismo tamaño. El río tardará un momento en completarse de arriba a abajo, pero el efecto resultante debería ser bastante agradable, ya que podría terminar con algo como esto simplemente en función de los nodos que tienen ríos.
También, dependiendo de la semilla y el código, podría tener un aspecto diferente cada vez que lo ejecutara, incluso si la ubicación del nodo fuera la misma.
Espero que este ejemplo esté en algún lugar en la línea que estás buscando.
fuente