¿Cómo puedo generar un path procesal infinito?

Actualmente estoy tratando de hacer un juego donde el jugador compita con otros a lo largo de un path infinito, más o less recto.

Por "más o less recto", quiero decir que el path sigue recto (el jugador no puede girar su vehículo hacia la izquierda o hacia la derecha), pero hay curvas en el path para que pasen, como si estaban cambiando de un carril a otro en una carretera.

También habrá diferentes "áreas" para correr (todas en la misma carretera), por ejemplo, desiertos, junglas y sobre el agua.

Y, finalmente, habrá lagunas en el path para que el jugador salte, así como puntos de control cada cierto time.

mi imagen (con hermosos círculos dibujados a mano alzada)

Comenzando con una semilla, ¿cómo puedo generar el path por delante del jugador mientras corren? No puedo generar todo el path por adelantado (obviamente), pero cada jugador necesita ver lo mismo en los mismos lugares a lo largo de la pista.

¿Cómo puedo hacer esto?

Como sabes, si quieres generar el path para que ambos jugadores vean lo mismo, entonces debes comenzar desde un valor inicial común.

Si siempre comienzas a generar el path desde el principio, entonces puedes seguir llamando a tu generador de numbers aleatorios y los valores que produce deben ser consistentes para ambos jugadores en cada paso. (Suponiendo que los dispositivos de ambos jugadores usen el mismo generador de numbers pseudoaleatorios (PRNG), que no siempre es el caso. Puede que necesite proporcionar su propio PRNG para asegurarse de que sea consistente para todos los jugadores).

Si desea poder reanudar desde diferentes puntos a lo largo de la pista, deberá ser capaz de resembrar el PRNG desde ese punto y mantenerlo constante. Haría esto calculando una nueva semilla en cada sección (ya sea que esté reanudando o no) utilizando la semilla original más algún valor reproducible como la distancia recorrida.

P.ej. (pseudo-código)

levelSeed = 1234 // starting seed distanceTraveled = 100 // keep track of this every frame // update this prior to adding a new section, obstacle, enemy, etc // each time the distance is different rand.setSeed(levelSeed + distanceTravelled) // example of picking a new trackSegment, after updating the seed value trackSegment = trackTiles[rand.getInt(numTrackTiles)]