¿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.
fuente
Respuestas:
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.
fuente
float pos = 1000000000.0f; float nextPos = pos + 0.001f; float diff = nextPos - pos;
En mi máquina, diff es 0.