Melhor maneira de criar um mapa para um jogo 2D?


16

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.


Qual máquina você está usando?
David Titarenco

Windows com C ++ usando SFML até o momento (SFML está sujeito a alterações; C ++ não). Não pretendemos portabilidade atm.
IAE

2
Se você estiver indo para Zelda da velha escola no NES, usou apenas mapas de 1 tela. Pequenos mapas ajudam os jogadores a focar o alcance de suas intenções (ou seja, em uma masmorra, você está lidando apenas com o seu quarto. No diablo, os monstros não se moviam para cima e para baixo no chão) e permitem que eles se sintam completos se tiverem pesquisado a área inteira que jogos em espaço aberto como FAllout3 e Oblivion não dão a você.
Stephen Furlani

Respostas:


27

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).


6
Um pouco de matemática ilustrativa: 10 MB de ladrilhos * dão a você um quadrado com 1619 ladrilhos por lado. Os mapas originais de Zelda eram 256 blocos no lado comprido e menos da metade do que no lado curto - portanto, seu mapa poderia ser 36 vezes maior que o primeiro Zelda com esse uso de memória. Você está realmente preparado para criar tanto conteúdo ? (#)

@ user744 Esse comentário é incrivelmente enganador. Para criar um mapa, você precisa mais do que apenas ponteiros para blocos. Você precisa armazenar os dados que os blocos também contêm. Nem todo jogo 2D tem uma quantidade definida de blocos fixos predefinidos.
Jeroen

5

Pessoalmente, eu construí o mapa usando um editor de blocos designado como o TileEd . Essa abordagem gera vários benefícios:

  • Usa menos recursos. Você só precisa carregar uma planilha e um arquivo de dados com índices para criar um mapa potencialmente interminável.
  • Como você terá seu mapa dividido em pedaços muito pequenos (dependendo do tamanho do seu bloco), você poderá adicionar / remover linhas / colunas facilmente enquanto o personagem estiver se movendo pelo mundo.
  • Ter um arquivo de dados que descreva seu mapa também permite adicionar informações do terreno com facilidade. Isso permite diferentes tipos de azulejos, como paredes ou lagos (obstáculos) ou um pântano onde o movimento do personagem pode ser mais lento ...
  • Por último, mas não menos importante, um mapa baseado em blocos também é muito mais fácil de editar e ajustar mais tarde, porque você sempre pode iniciar o editor, alterar algumas coisas e salvar um novo arquivo de dados.

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 Spriteclasse ou usar a Copyfunção da Imageclasse.

Atualização: Acabei de ler alguns dos documentos SFML e você definitivamente deve usar Drawableou em Spritevez 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.


1

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.



-3

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.


Só porque 10fps é aceitável para o seu jogo não a torna uma boa ideia, especialmente em um dispositivo com restrições de energia como um iPhone. Você pode fazer zero redesenhos, deixar o lado da GPU lidar com a rasterização e realmente deixar o programa passar algum tempo dormindo, para que o telefone não fique quente ou fique sem bateria.

@Joe Wreschnig ... ??? Eu disse que ele chama por demanda, quando o player move a tela, caso contrário, a imagem de plano de fundo do UIImageView não é redesenhada , economizando assim o poder de processamento. Seu comentário não faz sentido.
Stephen Furlani

Não estou reivindicando os fps exigidos pelo seu jogo. Estou dizendo que o OpenGL pode fornecer 60fps para uma coisa trivial (na verdade, você nem fala de "redesenhar" com cenas estáticas e do OpenGL) - se você só precisa de 10fps, usar o OpenGL permite que você não gaste a energia da bateria. outros "50 quadros". Seu método de desenho é um desperdício em um mundo com aceleração de GPU. Provavelmente tudo bem no PC, mas não quando você está gastando a bateria.

@ Joe, ainda não tenho certeza do que você está dizendo. Desenha uma imagem. Em seguida, a imagem é deixada em paz até o player atingir um limite e, em seguida, redesenha uma nova imagem. Como isso desperdiça a vida da bateria? Ele apenas "desenha" sob demanda e, durante o resto do tempo, a vista é desenhada usando o algoritmo de desenho nativo do UIImageView.
Stephen Furlani
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.