Pipeline de conteúdo XNA com o utilitário de criação de mapas

7

Estive estudando como usar o pipeline de conteúdo XNA adequadamente para um jogo em que estou trabalhando. No entanto, tenho tido dificuldade em entender e não tenho certeza sobre a melhor maneira de proceder.

O exemplo específico é: eu tenho um jogo estilo RPG 2D de baixo para cima. Desejo criar um utilitário (provavelmente Windows Forms) que permita criar e editar mapas facilmente. Cada mapa consiste em 1 ou mais camadas gráficas, cada camada contendo uma grade N x N de blocos. Por sua vez, cada bloco começa como um bitmap.

Dadas as informações acima, vejo algumas maneiras de proceder:

  1. Armazene as informações do mapa em um arquivo XML compatível com o carregador XML do Content Pipeline. Cada bloco é armazenado como uma referência de sequência ao recurso de textura correspondente. Recursos de textura são adicionados ao projeto do jogo.
  2. Armazene as informações do mapa em um arquivo XML compatível com o carregador XML do Content Pipeline. Cada bloco é armazenado como o caminho para os arquivos .bmp / ​​.png correspondentes.

Agora, há coisas que eu realmente não gosto nas duas abordagens. O principal problema da abordagem 1 é que a criação do mapa e a criação de ativos de textura .xnb são completamente separadas. O arquivo de mapa .xml é criado pelo utilitário, enquanto o recurso de textura é adicionado ao meu conteúdo no meu jogo. Isso se torna um problema ao tentar garantir que o arquivo de mapa .xml e todos os ativos de textura no projeto permaneçam sincronizados.

A abordagem dois me permitiria manter todo o arquivo de imagem apropriado ao lado dos arquivos de mapa usando o utilitário de mapa. No entanto, parece que eu não deveria ter que fazer algo assim. Além disso, eu precisaria ser mais inteligente sobre o carregamento dos mapas para não carregar rapidamente a mesma imagem do disco para cada bloco.

Portanto, minha pergunta é: se você deseja adicionar um utilitário de geração de conteúdo (como um editor de mapas), qual é a melhor maneira de garantir que o conteúdo personalizado (arquivo de mapa) permaneça sincronizado com os ativos de textura. Além disso, lembre-se de que no meu editor de mapas eu precisaria carregar e exibir os ativos de textura.

Qualquer entrada é muito apreciada.

DeusAduro
fonte

Respostas:

6

O que você quer é obter suas texturas para construir com base no conteúdo do arquivo XML. Dessa forma, você não precisa adicionar as texturas ao seu projeto de conteúdo, o pipeline incluirá automaticamente o arquivo de textura na compilação para você.

Para fazer isso, você precisará escrever um processador de conteúdo personalizado (ainda é possível usar o importador XML padrão) e usá ContentProcessorContext.BuildAsset-lo nesse processador para referenciar a textura externa.

Eu acho que você precisará criar um costume ContentTypeWritere ContentTypeReaderescrever e depois ler o ExternalReferenceque BuildAssetvocê fornece.

Andrew Russell
fonte
Andrew está bem aqui!
Roy T.
2

Coloque todas as imagens de bloco em um único arquivo de imagem e faça referência a elas pelo número do bloco.

Isso será muito mais eficiente e à prova de erros e tem a vantagem de poder configurar seus níveis em um editor de blocos como o Tiled .

BlueRaja - Danny Pflughoeft
fonte
Isso só trabalho mais performantly para extremamente pequenos jogos desde o carregamento muito grande uma textura não vai é lenta e acima de determinadas resoluções impossível
Roy T.
11
@ Roy T: Se você tem tantos ladrilhos que sua textura compactada é "muito grande", é provável que você precise empacotá-los em uma ou mais texturas para obter desempenho de renderização.
Andrew Russell
@ Andrew Russel, sim, é isso que eu quis dizer :). Mas eu comecei a calcular e uma textura de 4096 x 4096 (no máximo em cartões de vídeo mais antigos) pode incluir sprites de 64 x 64 (também conhecido como 4096) de 64 x 64, então talvez não seja tão problemático quanto eu pensava.
Roy T.
1

Não tenho 100% de certeza de que sua pergunta ficou clara na minha cabeça, mas tente o seguinte:

Você terá que tornar o editor de mapas líder, não adicione ativos ao seu projeto de conteúdo, exceto um arquivo XML (game.xml ou algo assim). Agora faça com que seu editor de níveis edite o arquivo game.xml adicionando links a outros arquivos. Por exemplo, a criação de um novo nível no seu editor de níveis adiciona a tag <level rank=5>Content/MyLevel/level5.xml/>ao seu arquivo XML.

Agora, para criar tudo, você precisa escrever uma extensão de pipeline de conteúdo personalizado. (Certifique-se de definir o novo importador e processador no arquivo game.xml em vez do processador XML padrão)

Esse processador percorrerá os arquivos XML e criará todos os ativos chamando os importadores e o processador apropriados. Isso deixará você com tudo bem construído e sem ter que ir e voltar para o projeto de conteúdo e seu editor.

Recursos: http://msdn.microsoft.com/en-us/library/bb447754.aspx

Roy T.
fonte