Generación procesal de nivel infinito

16

¿Cuáles son algunos buenos enfoques para generar procesalmente un nivel 2d infinito? El nivel podría estar limitado en cualquier dimensión, pero no necesariamente.

El enfoque que tiene más sentido para mí hasta ahora es usar un radio basado en cuadrícula. por ejemplo, divida el área de juego en una cuadrícula con cuadrados de cierto tamaño y luego cargue X cuadrados en un radio alrededor del jugador. Luego, cuando el jugador se mueve a otra casilla, construye el siguiente set y suelta más lejos (no es necesario el área explorada persistente). Cuando se construye una casilla, contiene una disposición aleatoria de objetos. Cuando los objetos abandonan el anillo exterior de los cuadrados, se eliminan del mundo. ¿Hay formas mejores o diferentes? O si este es un buen enfoque, ¿cuáles son los posibles problemas?

En aras de la discusión, puede pensar en el nivel como un campo de asteroides de arriba hacia abajo con potenciadores, etc. dispersos por todas partes.

Colin Gislason
fuente
2
Esto parece estar relacionado: gamedev.stackexchange.com/questions/2230/…
jacmoe
^ y así está en la columna "Relacionado" en el lado derecho. No es necesario vincular.
Ricket
77
Y luego se convirtió en "vinculado", así como "relacionado" - ordenado, ¿eh? :)
jacmoe

Respuestas:

6

Un problema con los mundos "infinitos" es que sus coordenadas subyacentes podrían no ser infinitas. A veces, si el juego ralentiza al jugador lo suficiente, puede que no sea una preocupación, porque el tiempo para alcanzar el número entero, por ejemplo, sería demasiado largo para llegar a él. Pero si permite grandes diferencias en la velocidad, es posible que deba ser muy preciso y de gran alcance, que necesitaría pensar en sus coordenadas. Una solución razonable sería tener dos niveles, como las coordenadas enteras de la cuadrícula y las coordenadas flotantes en cada referencia de la cuadrícula.

Por otro lado, incluso podría ser capaz de persistir adecuadamente en el diseño de su mundo, utilizando las coordenadas de la cuadrícula como una semilla para crear su mundo aleatorio en un cuadrado determinado. Entonces, cuando el jugador abandona el área, puedes soltarla y cuando el jugador regrese, puedes regenerarla desde la semilla.

pequeño_duck
fuente
44
Este problema se puede evitar centrando el mundo de vez en cuando.
Jonathan Fischoff el
También tenga en cuenta no solo la envoltura entera sino también las imprecisiones de los pequeños cambios de coma flotante cuando el número de coma flotante es alto. Prueba esto: float pos = 1000000000.0f; float nextPos = pos + 0.001f; float diff = nextPos - pos; En mi máquina, diff es 0.
tenpn
Todos estos son buenos puntos. Creo que sería apropiado volver a centrar las coordenadas cada vez que se genera un nuevo conjunto de cuadrados, siempre que sea lo suficientemente eficiente.
Colin Gislason
Por cierto, esta es la misma solución que en la versión para PC de Minecraft :) +1 para entero fijo + flotante, que en mi opinión es la mejor solución
GameDeveloper