Peço desculpas pela palavra-chave "melhor" subjetiva.
Meu amigo e eu começamos a criação de um jogo de aventura em 2D. Será de cima para baixo no estilo de pokemon ou zelda (apenas a perspectiva). Temos discutido métodos para criar um grande mapa-múndi que o jogador pode percorrer sem sobrecarregar os recursos de memória de nossa máquina.
Nosso primeiro impulso foi criar um mapa grande e um círculo ao redor do player no qual o conteúdo será carregado. Concluímos que isso não duraria muito e decidimos dividir o mapa em seções. Primeiro, tínhamos quatro seções grandes, mas percebemos que poderíamos simplesmente dividi-las em várias seções minúsculas.
Joguei Zelda no SNES e vi que, durante a mudança de um mapa, o conteúdo podia ser carregado naquele momento. O que quero dizer é que, em vez de apenas verificar uma área retangular para carregar dados, simplesmente dividimos o mapa em muitos pequenos pedaços que carregam e descarregam dados à medida que passamos de parte do mapa para parte do mapa.
Hoje, ele me disse que queria criar um mapa de matriz simplesmente 2D [WIDTH] [HEIGHT] que contém dados sobre todas as grades do jogo e é uma operação constante de salvar em disco para dados que não precisamos.
Não tenho certeza sobre essas idéias e pensei que poderia fazê-lo aqui. Quaisquer links, recursos ou tutoriais sobre o assunto serão muito apreciados, bem como respostas diretas à nossa pergunta sobre como fazê-lo com eficiência.
fonte
Respostas:
Primeiro, estime o tamanho do seu mapa. Não basta assumir que um "grande mundo" não vai caber na memória. Atualmente, um mapa com mais de 10 mb de memória é absolutamente aceitável e você pode colocar MUITOS 10 mb em um mundo 2D simples baseado em blocos.
Se você tem um mundo realmente grande, a solução mais robusta é de fato usar pedaços de mapas. Divida seu mundo em pedaços de tamanho fixo (por exemplo, 64x64). Carregue pedaços rapidamente enquanto o jogador se move, mantendo pelo menos um pedaço carregado em todas as direções (por exemplo, carregue o pedaço em que o jogador está e todos os seus vizinhos).
Quanto à descarga de pedaços, você pode escolher entre várias estratégias. Descargar ansiosamente significa que você descarrega e salva em disco todos os pedaços no momento em que o player se move suficientemente longe; mas você também pode atrasar o descarregamento para melhorar o desempenho (salvar partes, como qualquer acesso ao disco, é uma operação cara).
fonte
Pessoalmente, eu construí o mapa usando um editor de blocos designado como o TileEd . Essa abordagem gera vários benefícios:
Eu sugiro que você evite carregar bits do mapa durante o jogo para evitar atrasos. Como mencionado anteriormente, isso não deve ser necessário, pois você provavelmente poderá manter a folha de ladrilhos na memória. Quando o personagem entra em outra parte do "mundo", você pode trocar o lençol por outro diferente (por exemplo, ladrilhos de neve substituídos por ladrilhos do deserto).
Misturar as peças na tela é provavelmente a maneira mais rápida de renderizar seu mapa. Não conheço SFML, mas a partir dos documentos no site deles, você deve examinar a
Sprite
classe ou usar aCopy
função daImage
classe.Atualização: Acabei de ler alguns dos documentos SFML e você definitivamente deve usar
Drawable
ou emSprite
vez de manipular imagens para garantir o desempenho. Aparentemente, existe um carregador SFML lado a lado. Essa é provavelmente uma boa maneira de colocar algo em funcionamento rapidamente.fonte
Comece criando o mapa do tamanho necessário para contar a história que você deseja que o jogo conte. Teste na máquina com as especificações mínimas necessárias para as pessoas jogarem seu jogo. Se estiver muito lento, crie um perfil e otimize.
fonte
Usar uma matriz 2D de blocos individuais é melhor na minha opinião. Você pode ter todo o mapa grande inteiro como uma matriz 2D e desenhar apenas a parte que precisa ser exibida a qualquer momento. A seguir, é apresentado um exemplo do uso de uma matriz de mapas 2D com a biblioteca de jogos HTML5 tabageos (tbgs.js); http://actiontad.com/tabageosHTML5/Examples/BlitMathCameraAndTravelers/
fonte
A menos que você esteja planejando reconstruir o ultima-online (Fallout 3 ou Oblivion), não há razão para que o mundo precise ser perfeito. Baldur's Gate e Icewind Dale são dois jogos que vêm à mente que implementam mapas eficazes que não prejudicam a jogabilidade.
É verdade que você tem muito mais potência computacional do que eles, então o carregamento de telas deve ser mínimo, mas mesmo Fallout e Oblivion têm telas de carregamento para algumas coisas.
Tudo o que posso dizer é que, para mim, estou escrevendo uma pequena biblioteca de Obj-C para o iPhone, que pega um conjunto de peças 32x32 e a desenha em uma NSImage. Eu fico com cerca de 10 qps dessa maneira e provavelmente devo usar o OpenGL, mas só preciso redesenhar se o personagem sair do retângulo.
Você deve dividir o mapa em 9 tamanhos de tela (para mim são blocos de 960x640); se o personagem sair do bloco central, eu redesenho as 9 telas em uma imagem grande (cerca de 1,2 MB - dá muito quarto abaixo do limite de 20 MB no iPhone 3G). Isso acontece bem devagar (muito mais devagar que 10 qps), para que o novo desenho não seja perceptível durante a reprodução.
Provavelmente vou mudar para o OpenGL ES em algum momento, mas por enquanto ele funciona bem.
[EDITAR]
Permita-me esclarecer.
O algoritmo de desenho para o fundo de 9 telas leva 0,1 segundos (10fps nivelado). A menos que seu jogador possa atravessar uma tela inteira em menos de um décimo de segundo, o redesenho deve ser imperceptível durante o jogo.
fonte