Niedawno czytałem o tym, jak tworzyć światy proceduralne ... ale jak je uratować?
W grach takich jak Terraria lub Minecraft użytkownicy mogą dowolnie modyfikować krajobraz, ale tego świata nie można odtworzyć od początku. Jakie techniki są używane do ratowania proceduralnych, ale modyfikowalnych światów?
Zapisz ziarno, którego użyłeś do wygenerowania świata, a modyfikacje albo jako „komendy” atomowe, albo ich wyniki.
Następnie ładując zapisaną grę, wykonaj następujące czynności:
Proceduralnie generuj część świata, którą aktualnie odwiedzasz.
Zastosuj zapisane polecenia lub zastąp wygenerowane elementy zapisanymi.
Aktualizacja: I oczywiście istnieje możliwość uratowania wygenerowanego świata tak jak normalny świat, jeśli zasoby są dostępne (jak widać w Minecraft). W takim przypadku powinieneś uratować tylko te części świata, które już zostały odwiedzone (w przeciwnym razie generowanie procedur byłoby prawie bezcelowe), płytka po płytce. To zużywa więcej HDD i / lub zasobów bazy danych, ale będzie wymagało mniejszej mocy procesora podczas ładowania gry.
Oprócz modyfikacji, prawdopodobnie musi także zapisać ziarno, które zostało użyte do zbudowania świata proceduralnego ;-)
bummzack
@bummzack Tak, oczywiście, zapomniałem o tym wspomnieć, ponieważ to oczywiste :-) Zmienię swoją odpowiedź.
Marton
10
I'm not entirely sure that regenerating the world from the seed is the best idea. World generation usually involves complex algorithms and hence takes time : we generate random worlds not to save space generally but to benefit from the randomness. I would therefore consider that saving the entire world in a binary format would be more efficient.
Jonathan Connell
2
So you're saying to save a procedurally generated world, you generate it, then save it? This is not a very complete answer.
MichaelHouse
2
@ Random832 Minecraft ma uratować świat w formacie binarnym zamiast regenerując je od nasion i odtwarzanie modyfikacje. Aby obejść problem ocalenia całego świata, Minecraft zapisuje tylko te fragmenty, które zostały wygenerowane do tej pory. W miarę eksploracji świata Twoja gra zapisu staje się większa.
Joseph Mansfield,
8
Zapisywanie generowanego proceduralnie świata jest tym samym, co zapisywanie danych mapy kafelków.
Prawdopodobnie chcesz uratować świat w formacie binarnym, zakładając, że świat składa się z różnych rodzajów kafelków, będziesz musiał:
Zdecyduj o łącznej liczbie różnych rodzajów kafelków. (W zależności od tego będziesz potrzebować mniej lub więcej bitów do reprezentowania każdej kafelki)
Define the width and height of the visited(modified) world.
Represent the world tile by tile from the top-most left tile (including sky) row by row to the bottom-most right tile.
If you wish to save up on space, use DEFLATE or a similar algorithm to compress this 2d-array(represented as 1-d) http://en.wikipedia.org/wiki/DEFLATE
Use appropriate file I/O for your API to store the data on disk.
You can use the same method to save a voxel based map too.
Storing a vertices based map model is more complex.
If you want to, you may be able to save it in a png file by color coding each tile. This will allow you to overview the result quickly without using a specialized viewer.
wolfdawn
4
About Minecraft, the world uses voxels so it's quite easy to save, more informations here :
Whatever data structure you're using to store the world in memory can be used as a template for writing and reading from disk. The procedural portion of your game will fill these data structures the first time, if no data is available from disk. Then, when you're ready to unload an area from memory, write it to disk as it has been generated or modified.
Whenever you're ready to load a new area into memory, first check to see if it's been generated before and saved to disk. If it has, load it from disk instead of from your procedural generation algorithms.
Typically this would be done with chunks of terrain. You can either save each chunk to it's own file, or create a more complex on disk structure that contains data in a single file with a look-up table. There are other questions about good ways to save your data to disk.
Zapisywanie generowanego proceduralnie świata jest tym samym, co zapisywanie danych mapy kafelków.
Prawdopodobnie chcesz uratować świat w formacie binarnym, zakładając, że świat składa się z różnych rodzajów kafelków, będziesz musiał:
You can use the same method to save a voxel based map too.
Storing a vertices based map model is more complex.
Would you like me to elaborate on that subject?
źródło
About Minecraft, the world uses voxels so it's quite easy to save, more informations here :
http://www.minecraftwiki.net/wiki/Region_file_format
http://www.minecraftwiki.net/wiki/Level_Format
As already said, save a seed used to generate the world, and adapt your save format to what your world is made of (cubes, atoms, etc...).
źródło
Whatever data structure you're using to store the world in memory can be used as a template for writing and reading from disk. The procedural portion of your game will fill these data structures the first time, if no data is available from disk. Then, when you're ready to unload an area from memory, write it to disk as it has been generated or modified.
Whenever you're ready to load a new area into memory, first check to see if it's been generated before and saved to disk. If it has, load it from disk instead of from your procedural generation algorithms.
Typically this would be done with chunks of terrain. You can either save each chunk to it's own file, or create a more complex on disk structure that contains data in a single file with a look-up table. There are other questions about good ways to save your data to disk.
źródło