2D ver mapas de cima para baixo

8

Eu queria saber como isso funciona.

Você carrega o mapa completo quando o jogo inicia ou carrega partes do mapa em tempo de execução?

E como você salvaria os mapas? Seria em XML ou em algum formato binário?

Obrigado!

Kevin
fonte

Respostas:

23

Eu concordo com o eBusiness. Depende do tamanho e como você deseja editá-lo.

Estime o tamanho de bytes do seu mapa em uma representação razoavelmente compacta. Decida também quais partes do mapa podem mudar conforme o jogo é jogado. As partes que não mudam podem ser carregadas e não precisam ser salvas. Se o tamanho estimado for pequeno, armazene tudo na memória. Não vale a complexidade extra de carregar partes do mapa e rastrear o que você carregou ou não, a menos que os dados sejam tão grandes que sejam necessários.

Por exemplo, se você estivesse escrevendo o Civilization II , o tamanho do mapa pode ser de 100 x 100 blocos.

  1. Cada bloco é um dos 12 tipos, para que você possa armazená-lo em 4 bits. Isso significa que o mapa principal é 100 x 100 x 0,5 bytes = 5.000 bytes para armazenar os tipos de bloco. O mapa principal nunca muda.
  2. Você também pode melhorar os mapas com estradas, irrigação, etc., e existem até 7 melhorias. Isso significa 2 ^ 7 valores diferentes, levando 7 bits, mas provavelmente usaríamos apenas 1 byte. Isso nos fornece 100 x 100 x 1 byte = 10.000 bytes para armazenar as melhorias.
  3. O nevoeiro da guerra nos diz quais blocos de mapa você viu, então você precisa de 1 bit por jogador. Se você limitar a 8 jogadores, esse é outro byte por bloco de mapa ou 10.000 bytes para o nevoeiro da guerra.
  4. Finalmente, existem todas as cidades e unidades. Você pode estimar que cada jogador tem até 20 cidades e 100 unidades, e cada uma delas pode exigir 100 bytes de dados (suposição), ou seja, 12.000 bytes (muito mais se você estiver usando XML).

Isso é menos de 30k para uma representação binária compacta dos objetos mapa + Civ II, para que você possa armazenar tudo na memória, mesmo se usar um formato detalhado muito maior. Eu obtive os números acima de alguém fazendo engenharia reversa na estrutura do mapa Civ II .

Daggerfall , considerado por alguns como um mapa ridiculamente grande, parece ter 5000x2500 e cerca de 25 megabytes, mas também possui um grande número de NPCs (750.000 é o que eu li, mas parece muito alto). Nos computadores de mesa / laptop de hoje, isso também pode caber na memória, mas em dispositivos móveis ou navegadores que podem ser um pouco grandes demais. Há um wiki descrevendo o formato do mapa de Daggerfall .

Você pode reduzir o tamanho identificando e considerando a redundância . Por exemplo, em vez de armazenar 100.000 árvores ou espadas idênticas, cada uma em um formato XML, armazene uma árvore e uma espada e 100.000 referências a elas. Nos formatos binários, essa referência pode ter apenas 1 ou 2 bytes e, em um formato mais detalhado, a referência ainda pode ser razoavelmente pequena.

Faça a coisa mais simples que funciona para o seu jogo. Se o mapa for pequeno, não importa se você usa um formato compacto ou detalhado. Se o formato compacto caberia na memória, mas o formato detalhado não, você precisa decidir se o trabalho extra do formato binário é mais ou menos do que o trabalho extra de carregar partes do mapa. Isso vai depender do jogo. Em um jogo do tipo Civ, onde você precisa de todos os dados para simular curvas, o formato binário é provavelmente uma escolha melhor. Em um jogo parecido com Daggerfall, em que você não precisa carregar áreas, exceto o que está perto do jogador, carregar partes do mapa é provavelmente uma escolha melhor. Se o mapa é tão grande que mesmo o formato compacto não cabe na memória, primeiro pergunte a si mesmo se realmente vale a pena todo o trabalho extra para lidar com isso e, se for o caso, crie um formato binário no qual você possa carregar partes.

Para o meu projeto atual (hobby), os mapas e todos os objetos neles cabem em 50 MB, portanto, manter tudo na memória seria bom. No entanto, eu quero que ele seja executado no navegador e 50 MB é mais do que desejo transferir pela rede, por isso estou mantendo todos na memória do servidor e carregando apenas partes do mundo no cliente. Os blocos do meu mapa têm 1 byte por bloco, 2048x2048 blocos (4 MB). Os objetos (árvores, cadeiras, orcs etc.) são codificados em JSON para simplificar. No cliente, apenas carrego as áreas do mapa (incluindo seus objetos) que estão próximas ao player.

amitp
fonte
11
Obrigado por uma ótima resposta, isso me esclareceu muito! (Boa sorte PS com o seu projeto :)
Kevin
4

A quantidade de carga depende pelo menos de quão grande é o mapa, se os dados puderem caber razoavelmente na memória, não haverá realmente motivo para se preocupar com o carregamento progressivo.

A coisa mais notável que o XML faz é ocupar muito espaço extra de armazenamento / memória / espaço de rede / tráfego. Se você acha que usar XML é divertido, faça isso apenas para quantidades relativamente pequenas de dados.

Ao projetar um formato de dados, você deve ter em mente como deseja editar esses dados. Você pode usar um editor de texto simples para gravar seus dados como um arquivo de texto simples, esses arquivos diretamente ou convertê-los em um formato binário para economizar espaço. Você pode usar um editor de imagens para aumentar seus níveis como bitmaps. Novamente, convém converter para um arquivo menor.

Ou você pode criar seu próprio editor; nesse caso, há poucas razões para não usar um formato binário compacto.

aaaaaaaaaaaa
fonte
1

Não há uma resposta para essas perguntas. Tudo isso é inerentemente com você.

Você pode salvar os mapas da maneira que quiser e exibi-los / renderizá-los a qualquer momento.

Bryan Harrington
fonte
Vou acrescentar mais uma coisa, por razões de desempenho, você pode carregar partes do mapa ao longo do tempo, mas acho que para os jogos mais práticos não importa, a menos que você esteja desenvolvendo em dispositivos móveis.
Bryan Harrington
2
Isso pode ser verdade, mas poderia ter sido bom fornecer algumas maneiras gerais de fazer isso.
The Duck comunista
Enquanto eu entendo, eu costumava estar nessa posição "Como faço para 'isso'". Aprendi da maneira mais difícil em um curso de gráficos que fiz, precisávamos implementar o A * com uma malha de navegação. Passei horas pesquisando, lendo e tentando procurar maneiras de fazê-lo. Em última análise, isso nunca foi feito. Que lição eu aprendi? Eu deveria ter feito isso da maneira que entendi antes de complicar meu cérebro com complicações.
Bryan Harrington