Recientemente leí sobre cómo crear mundos de procedimiento ... pero ¿cómo guardo uno?
En juegos como Terraria o Minecraft, los usuarios pueden modificar libremente el paisaje, pero ese mundo no se puede recrear desde el inicio. ¿Qué técnicas se utilizan para salvar mundos procesales pero modificables?
Guarde la semilla que utilizó para generar el mundo y las modificaciones, ya sea como "comandos" atómicos o como resultados de ellos.
Luego, al cargar el juego guardado, haces lo siguiente:
Genera procesalmente la parte del mundo que estás visitando actualmente.
Aplique los comandos guardados o sobrescriba los elementos generados con los guardados.
Actualización: Y, por supuesto, existe la opción de guardar su mundo generado como un mundo normal, si los recursos están disponibles (como se ve en Minecraft). En este caso, debe guardar solo las partes del mundo que ya han sido visitadas (de lo contrario, la generación procesal sería prácticamente inútil), mosaico por mosaico. Esto consume más recursos de HDD y / o base de datos, pero requerirá menos potencia de CPU al cargar un juego.
Además de las modificaciones, probablemente también necesite guardar la semilla que se utilizó para construir el mundo procesal ;-)
bummzack
@bummzack Sí, por supuesto, olvidé mencionar eso, porque es obvio :-) Editaré mi respuesta.
Marton
10
No estoy del todo seguro de que la mejor idea sea regenerar el mundo a partir de la semilla. La generación mundial generalmente involucra algoritmos complejos y, por lo tanto, lleva tiempo: generamos mundos aleatorios no para ahorrar espacio en general, sino para beneficiarnos de la aleatoriedad. Por lo tanto, consideraría que salvar el mundo entero en formato binario sería más eficiente.
Jonathan Connell
2
Entonces, ¿estás diciendo que salves un mundo generado por procedimientos, lo generas y luego lo guardas? Esta no es una respuesta muy completa.
MichaelHouse
2
@ Random832 Minecraft hace salva al mundo en un formato binario, en lugar de regenerarla de la semilla y repetición de las modificaciones. Para evitar el problema de salvar al mundo entero, Minecraft solo guarda los fragmentos que se han generado hasta ahora. A medida que exploras más el mundo, tu partida guardada se hace más grande.
Joseph Mansfield
8
Guardar un mundo generado por procedimientos es lo mismo que guardar cualquier dato de mapa de mosaico.
Es probable que desee salvar el mundo en formato binario, suponiendo que el mundo esté construido con diferentes tipos de mosaicos, tendrá que:
Decida el número total de diferentes tipos de mosaicos (dependiendo de eso, necesitará más o menos bits para representar cada mosaico)
Defina el ancho y la altura del mundo visitado (modificado).
Representa el mundo mosaico por mosaico desde el mosaico superior izquierdo (incluido el cielo) fila por fila hasta el mosaico inferior derecho.
Si desea ahorrar espacio, use DEFLATE o un algoritmo similar para comprimir esta matriz 2d (representada como 1-d) http://en.wikipedia.org/wiki/DEFLATE
Use la E / S de archivo adecuada para su API para almacenar los datos en el disco.
También puede usar el mismo método para guardar un mapa basado en vóxel.
Almacenar un modelo de mapa basado en vértices es más complejo.
Si lo desea, puede guardarlo en un archivo png al codificar por color cada mosaico. Esto le permitirá a la visión general el resultado de forma rápida sin necesidad de utilizar un visor especializado.
wolfdawn
4
Acerca de Minecraft, el mundo usa vóxeles, por lo que es bastante fácil de guardar, más información aquí:
Como ya se dijo, guarde una semilla utilizada para generar el mundo y adapte su formato de guardado a la composición de su mundo (cubos, átomos, etc.).
Cualquier estructura de datos que esté utilizando para almacenar el mundo en la memoria puede usarse como plantilla para escribir y leer desde el disco. La parte de procedimiento de su juego llenará estas estructuras de datos la primera vez, si no hay datos disponibles desde el disco. Luego, cuando esté listo para descargar un área de la memoria, escríbala en el disco a medida que se ha generado o modificado.
Siempre que esté listo para cargar una nueva área en la memoria, primero verifique si se ha generado antes y se ha guardado en el disco. Si es así, cárguelo desde el disco en lugar de desde sus algoritmos de generación de procedimientos.
Por lo general, esto se haría con trozos de terreno. Puede guardar cada fragmento en su propio archivo o crear una estructura de disco más compleja que contenga datos en un solo archivo con una tabla de búsqueda. Hay otras preguntas sobre buenas maneras de guardar sus datos en el disco.
Guardar un mundo generado por procedimientos es lo mismo que guardar cualquier dato de mapa de mosaico.
Es probable que desee salvar el mundo en formato binario, suponiendo que el mundo esté construido con diferentes tipos de mosaicos, tendrá que:
También puede usar el mismo método para guardar un mapa basado en vóxel.
Almacenar un modelo de mapa basado en vértices es más complejo.
¿Quieres que explique sobre ese tema?
fuente
Acerca de Minecraft, el mundo usa vóxeles, por lo que es bastante fácil de guardar, más información aquí:
http://www.minecraftwiki.net/wiki/Region_file_format
http://www.minecraftwiki.net/wiki/Level_Format
Como ya se dijo, guarde una semilla utilizada para generar el mundo y adapte su formato de guardado a la composición de su mundo (cubos, átomos, etc.).
fuente
Cualquier estructura de datos que esté utilizando para almacenar el mundo en la memoria puede usarse como plantilla para escribir y leer desde el disco. La parte de procedimiento de su juego llenará estas estructuras de datos la primera vez, si no hay datos disponibles desde el disco. Luego, cuando esté listo para descargar un área de la memoria, escríbala en el disco a medida que se ha generado o modificado.
Siempre que esté listo para cargar una nueva área en la memoria, primero verifique si se ha generado antes y se ha guardado en el disco. Si es así, cárguelo desde el disco en lugar de desde sus algoritmos de generación de procedimientos.
Por lo general, esto se haría con trozos de terreno. Puede guardar cada fragmento en su propio archivo o crear una estructura de disco más compleja que contenga datos en un solo archivo con una tabla de búsqueda. Hay otras preguntas sobre buenas maneras de guardar sus datos en el disco.
fuente