Primeiro, deixe-me dizer que os RPGs 2D estão próximos e queridos pelo meu coração, e trabalhar com os antigos motores DX7 VB6 MORPG (não ria, faz 8 anos, agora :-)) foi o que me interessou pelo desenvolvimento de jogos . Mais recentemente, comecei a converter um jogo em que trabalhei em um desses mecanismos para usar o XNA.
Dito isso, minha recomendação é que você use uma estrutura baseada em blocos com camadas para o seu mapa. Com qualquer API gráfica usada, você terá um limite no tamanho das texturas que pode carregar. Sem mencionar os limites de memória de textura da placa de vídeo. Portanto, considerando isso, se você deseja maximizar o tamanho de seus mapas, além de minimizar a quantidade e o tamanho de texturas carregadas na memória, mas também diminuir o tamanho de seus ativos no disco rígido do usuário E os tempos de carregamento, definitivamente vai querer ir com azulejos.
Quanto à implementação, eu entrei em detalhes sobre como eu lidei com isso em algumas perguntas aqui no GameDev.SE e no meu blog (ambos os links abaixo), e não é exatamente isso que você está perguntando, então eu vou vá para o básico aqui. Também anotarei os recursos dos ladrilhos que os tornam benéficos ao carregar várias imagens pré-renderizadas grandes. Se algo não estiver claro, me avise.
- A primeira coisa que você precisa fazer é criar uma planilha. Esta é apenas uma imagem grande que contém todos os seus blocos alinhados em uma grade. Esse (e talvez um extra, dependendo do número de blocos) será a única coisa que você precisará carregar. Apenas 1 imagem! Você pode carregar 1 por mapa ou um com cada peça do jogo; qualquer organização que funcione para você.
- Em seguida, você precisa entender como pode pegar essa "planilha" e converter cada bloco em um número. Isso é bem direto com algumas contas simples. Observe que a divisão aqui é uma divisão inteira , portanto, as casas decimais são descartadas (ou arredondadas, se você preferir).
OK, agora que você dividiu a planilha em uma série de células (números), você pode pegar esses números e conectá-los ao contêiner que desejar. Por uma questão de simplicidade, você pode simplesmente usar uma matriz 2D.
int[,] mapTiles = new int[100,100]; //Map is 100x100 tiles without much overhead
Em seguida, você deseja desenhá-los. Uma das maneiras pelas quais você pode tornar isso MUITO mais eficiente (dependendo do tamanho do mapa) é calcular apenas as células que a câmera está visualizando no momento e passar por elas. Você pode fazer isso buscando as coordenadas da matriz do bloco de mapa dos cantos superior esquerdo ( tl
) e inferior direito ( br
) da câmera . Em seguida, faça um loop de tl.X to br.X
e, em um loop aninhado, de tl.Y to br.Y
para desenhá-los. Exemplo de código abaixo:
for (int x = tl.X; x <= br.X;x++) {
for (int y = tl.Y; y <= br.Y;y++) {
//Assuming tileset setup from image
Vector2 tilesetCoordinate = new Vector2((mapTiles[x,y] % 8) * 32,(mapTiles[x,y] / 8) * 32);
//Draw 32x32 tile using tilesetCoordinate as the source x,y
}
}
- Jackpot! Esse é o básico do mecanismo de blocos. Você pode ver que é fácil ter até um mapa de 1000 x 1000 com pouco custo adicional. Além disso, se você tiver menos de 255 blocos, poderá usar uma matriz de bytes cortando a memória em 3 bytes por célula. Se um byte for muito pequeno, um ushort provavelmente será suficiente para suas necessidades.
Nota: Eu deixei de fora o conceito de coordenadas mundiais (que é a posição da sua câmera), pois acho que está fora do escopo desta resposta. Você pode ler sobre isso aqui no GameDev.SE.
Meus recursos de mecanismo de bloco
Observação: todos esses são direcionados para o XNA, mas praticamente se aplica a qualquer coisa - você só precisa alterar as chamadas de empate.
- Minha resposta a esta pergunta descreve como eu manejo as células do mapa e as camadas no meu jogo. (Veja o terceiro link.)
- Minha resposta a esta pergunta explica como eu armazeno os dados em um formato binário.
- Este é o primeiro (bem, tecnicamente o segundo, mas o primeiro "técnico") post sobre o desenvolvimento do jogo no qual eu estava trabalhando. A série inteira contém informações sobre coisas como pixel shaders, iluminação, comportamento de blocos, movimento e todas essas coisas divertidas. Na verdade, atualizei a postagem para incluir o conteúdo da minha resposta no primeiro link que publiquei acima; portanto, você pode lê-la (talvez eu tenha adicionado coisas). Se você tiver alguma dúvida, deixe um comentário aqui ou aqui e ficarei feliz em ajudar.
Outros recursos do mecanismo de bloco
- O tutorial do mecanismo de blocos deste site me deu a base que usei para criar meus mapas.
- Ainda não assisti esses tutoriais em vídeo porque ainda não tive tempo, mas provavelmente são úteis. :) Eles podem estar desatualizados, se você estiver usando XNA.
- Este site tem mais alguns tutoriais que (eu acho) são baseados nos vídeos acima. Pode valer a pena conferir.