Li recentemente sobre como criar mundos procedimentais ... mas como faço para salvar um?
Em jogos como Terraria ou Minecraft, os usuários podem modificar livremente a paisagem, mas esse mundo não pode ser recriado desde o início. Quais técnicas são usadas para salvar mundos procedimentais, mas modificáveis?
Salve a semente que você usou para gerar o mundo e as modificações como "comandos" atômicos ou como resultado disso.
Então, ao carregar o jogo salvo, faça o seguinte:
Gere proceduralmente a parte do mundo que você está visitando no momento.
Aplique os comandos salvos ou substitua os elementos gerados pelos salvos.
Atualização: E, é claro, existe a opção de salvar seu mundo gerado como um mundo normal, se os recursos estiverem disponíveis (como visto no Minecraft). Nesse caso, você deve salvar apenas as partes do mundo que já foram visitadas (caso contrário, a geração processual seria praticamente inútil), lado a lado. Isso consome mais recursos de HDD e / ou banco de dados, mas requer menos energia da CPU ao carregar um jogo.
Além das modificações, ele provavelmente também precisa salvar a semente que foi usado para construir o mundo processual ;-)
bummzack
@ albummzack Sim, claro, esqueci de mencionar isso, porque é óbvio :-) vou editar minha resposta.
Marton
10
Não tenho certeza absoluta de que regenerar o mundo a partir da semente é a melhor idéia. A geração mundial geralmente envolve algoritmos complexos e, portanto, leva tempo: geramos mundos aleatórios não para economizar espaço em geral, mas para nos beneficiarmos da aleatoriedade. Eu consideraria, portanto, que salvar o mundo inteiro em um formato binário seria mais eficiente.
Jonathan Connell
2
Então você está dizendo para salvar um mundo gerado processualmente, você o gera e depois salva? Esta não é uma resposta muito completa.
MichaelHouse
2
@ Random832 Minecraft faz salvar o mundo em um formato binário, em vez de regenerá-la a partir da semente e repetindo as modificações. Para contornar o problema de salvar o mundo inteiro, o Minecraft salva apenas os pedaços que foram gerados até agora. À medida que você explora o mundo, seu jogo salvo se torna maior.
Joseph Mansfield
8
Salvar um mundo gerado processualmente é o mesmo que salvar qualquer dado de mapa de bloco.
Você provavelmente desejaria salvar o mundo em formato binário, supondo que o mundo seja construído com diferentes tipos de blocos, você precisará:
Decida o número total de diferentes tipos de bloco. (Dependendo de que você precisará de mais ou menos bits para representar cada bloco)
Defina a largura e a altura do mundo visitado (modificado).
Represente o bloco do mundo por bloco, do bloco mais à esquerda (incluindo o céu), linha por linha, até o bloco mais à direita.
Se você deseja economizar espaço, use DEFLATE ou um algoritmo semelhante para compactar esse 2d-array (representado como 1-d) http://en.wikipedia.org/wiki/DEFLATE
Use a E / S de arquivo apropriada para sua API para armazenar os dados no disco.
Você também pode usar o mesmo método para salvar um mapa baseado em voxel.
Armazenar um modelo de mapa baseado em vértices é mais complexo.
Se desejar, você poderá salvá-lo em um arquivo png, codificando cores em cada bloco. Isso permitirá que você visualize rapidamente o resultado sem usar um visualizador especializado.
wolfdawn
4
Sobre o Minecraft, o mundo usa voxels, por isso é muito fácil salvar, mais informações aqui:
Qualquer estrutura de dados que você esteja usando para armazenar o mundo na memória pode ser usada como modelo para gravação e leitura em disco. A parte processual do seu jogo preencherá essas estruturas de dados na primeira vez, se nenhum dado estiver disponível no disco. Em seguida, quando estiver pronto para descarregar uma área da memória, grave-a no disco conforme foi gerada ou modificada.
Sempre que você estiver pronto para carregar uma nova área na memória, verifique primeiro se ela foi gerada antes e salva no disco. Se houver, carregue-o do disco, e não dos algoritmos de geração de procedimento.
Normalmente, isso seria feito com pedaços de terreno. Você pode salvar cada pedaço em seu próprio arquivo ou criar uma estrutura de disco mais complexa que contenha dados em um único arquivo com uma tabela de consulta. Há outras perguntas sobre boas maneiras de salvar seus dados em disco.
Salvar um mundo gerado processualmente é o mesmo que salvar qualquer dado de mapa de bloco.
Você provavelmente desejaria salvar o mundo em formato binário, supondo que o mundo seja construído com diferentes tipos de blocos, você precisará:
Você também pode usar o mesmo método para salvar um mapa baseado em voxel.
Armazenar um modelo de mapa baseado em vértices é mais complexo.
Deseja que eu elabore sobre esse assunto?
fonte
Sobre o Minecraft, o mundo usa voxels, por isso é muito fácil salvar, mais informações aqui:
http://www.minecraftwiki.net/wiki/Region_file_format
http://www.minecraftwiki.net/wiki/Level_Format
Como já foi dito, salve uma semente usada para gerar o mundo e adapte seu formato de salvamento ao que o seu mundo é feito (cubos, átomos, etc.).
fonte
Qualquer estrutura de dados que você esteja usando para armazenar o mundo na memória pode ser usada como modelo para gravação e leitura em disco. A parte processual do seu jogo preencherá essas estruturas de dados na primeira vez, se nenhum dado estiver disponível no disco. Em seguida, quando estiver pronto para descarregar uma área da memória, grave-a no disco conforme foi gerada ou modificada.
Sempre que você estiver pronto para carregar uma nova área na memória, verifique primeiro se ela foi gerada antes e salva no disco. Se houver, carregue-o do disco, e não dos algoritmos de geração de procedimento.
Normalmente, isso seria feito com pedaços de terreno. Você pode salvar cada pedaço em seu próprio arquivo ou criar uma estrutura de disco mais complexa que contenha dados em um único arquivo com uma tabela de consulta. Há outras perguntas sobre boas maneiras de salvar seus dados em disco.
fonte