Estou trabalhando em um RPG 2D, que apresentará os mapas habituais de masmorras / cidades (pré-gerados).
Estou usando peças, que depois combinarei para fazer os mapas. Meu plano original era montar os blocos usando o Photoshop, ou algum outro programa gráfico, para ter uma imagem maior que eu pudesse usar como mapa.
No entanto, eu li em vários lugares pessoas falando sobre como eles usaram matrizes para construir seu mapa no mecanismo (para que você forneça uma matriz de x blocos ao seu mecanismo e os monte como um mapa). Eu posso entender como isso é feito, mas parece muito mais complicado de implementar, e não vejo vantagens óbvias.
Qual é o método mais comum e quais são as vantagens / desvantagens de cada um?
Respostas:
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.
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.
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 detl.X to br.X
e, em um loop aninhado, detl.Y to br.Y
para desenhá-los. Exemplo de código abaixo: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.
Outros recursos do mecanismo de bloco
fonte
Os sistemas baseados em ladrilhos e um modelo estático / sistema de textura podem ser usados para representar um mundo e cada um tem diferentes pontos fortes. Se um é melhor que o outro, tudo se resume a como você usa as peças e o que funciona melhor para suas habilidades e necessidades.
Dito isto, ambos os sistemas podem ser usados separadamente ou também juntos.
Um sistema padrão baseado em blocos possui os seguintes pontos fortes:
A desvantagem dos blocos é que você precisa criar um sistema para construir esses dados baseados em blocos. Você pode criar uma imagem que use cada pixel como um bloco, criando assim sua matriz 2D a partir de uma textura. Você também pode criar um formato proprietário. Usando bitflags, você pode armazenar um grande número de dados por bloco em um espaço bastante pequeno.
A principal razão pela qual a maioria das pessoas faz blocos é porque isso lhes permite criar pequenos ativos e reutilizá-los. Isso permite que você crie uma imagem muito maior com pedaços menores. Reduz o retrabalho porque você não está mudando o mapa do mundo inteiro para fazer uma pequena alteração. Por exemplo, se você quiser mudar a sombra de toda a grama. Em uma imagem grande, você teria que repintar toda a grama. Em um sistema de ladrilhos, você apenas atualiza os ladrilhos de grama.
No geral, você provavelmente fará muito menos retrabalho com um sistema baseado em blocos do que um grande mapa gráfico. Você pode acabar usando um sistema baseado em blocos para colisão, mesmo que não o use no seu mapa de chão. Só porque você usa um bloco internamente não significa que você não pode usar modelos para representar os objetos do ambiente que podem usar mais de um bloco para seu espaço.
Você precisaria fornecer mais detalhes sobre seu ambiente / mecanismo / idioma para fornecer exemplos de código.
fonte
Desenhando o mapa: os mosaicos são fáceis no mecanismo, pois o mapa pode ser representado como uma enorme variedade de índices de mosaicos. O código do Draw é apenas um loop aninhado:
Para mapas grandes, uma imagem de bitmap enorme para o mapa inteiro pode ocupar muito espaço na memória e pode ser maior do que o que uma placa gráfica suporta para um único tamanho de imagem. Mas você não terá problemas com blocos porque aloca memória gráfica apenas uma vez para cada bloco (ou um total, de maneira ideal, se estiverem todos em uma folha)
Também é fácil reutilizar as informações do bloco, por exemplo, colisões. por exemplo, para obter o bloco de terreno no canto superior esquerdo do sprite do personagem:
Suponha que você precise verificar colisões com pedras / árvores, etc. Você pode colocar o ladrilho na posição de (posição do personagem + tamanho do sprite do personagem + direção atual) e verificar se está marcado como passável ou não.
fonte