Introdução Um panorama sobre a ferramenta Mappy Mappy é uma ferramenta “Free” para criação de mapa de Tiles para jogos 2D ou 3D. No Mappy, é possível criar mapas com tiles no formato retangular(utilizaremos esse formato para este artigo), hexagonal e Isométrico. Para quem não conhece o formato de tile Isométrico, um bom exemplo é o jogo vencedor da Imagine Cup 2008, o City Rain:
Essas bibliotecas lêem os mapas salvos num formato especifico desta ferramenta, que é o formato .FMP. O Mappy também exporta os mapas em arquivos de texto, uma solução bastante interessante para jogos em plataformas de dispositivos móveis. Um exemplo de um mapa com 25 tiles dispostos horizontalmente e 19 tiles dispostos verticalmente: const short TestLevel1_map0[19][25] = { { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 }, { 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 }, { 3, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 }, { 3, 1, 1, 1, 5, 4, 5, 1, 1, 1, 1, 1, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 3 }, { 3, 1, 1, 1, 1, 5, 1, 1, 1, 1, 1, 1, 3, 2, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 3 }, { 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 3 }, { 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, 1, 3 }, { 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 }, { 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 }, { 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3 }, { 3, 1, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 1, 1, 3, 2, 2, 2, 2, 2, 2, 3, 1, 3 }, { 3, 1, 1, 1, 1, 1, 3, 2, 3, 1, 1, 1, 1, 1, 1, 3, 2, 2, 2, 2, 2, 2, 3, 1, 3 }, { 3, 1, 1, 1, 1, 1, 3, 3, 3, 1, 1, 1, 1, 1, 1, 3, 2, 2, 2, 2, 2, 2, 3, 1, 3 }, { 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2, 2, 2, 2, 2, 3, 1, 3 }, { 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 2, 2, 2, 2, 2, 2, 3, 1, 3 }, { 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 1, 3 }, { 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 }, { 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3 }, { 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3 } }; Tenha em mente que cada elemento da matriz, representa um tile na malha de Tiles, como mostra a foto abaixo:
 Image 1 A matriz mostrada acima, de nome TestLevel1_map0, no Mappy pode ser vizualizada na foto abaixo:  Image 2
Leitores existentes para importar os mapas no formato .FMP Oficialmente(no site da ferramenta) existem leitores de arquivo .FMP, para as APIs abaixo: DirectX, Allegro, OpenGL, Java, Java, CDX, SDL, SDL, Delphi, Blitz Basic, Blitz, Basic, Blitz Max, GBA, Combined, GameMaker, GL Basic. Introdução ao que será apresentado Aqui! Além dessas APIs/FrameWorks “ofertadas” no site oficial do Mappy, existe também um leitor para o frameWork da PopCap Games que pode ser encontrado aqui. O leitor do camarada, como vocês puderam ler no fórum, foi abandonado e possui vários problemas que não vem ao caso discutir e foge ao escopo do que será discutido neste artigo. Então, eu fiz um porte desse leitor feito para o “PopCap FrameWork” para o XNA, ou seja, portei um código feito em C/C++ para C#/.Net/XNA FrameWork. Conhecendo a ferramenta Mappy
Criando um novo Mapa Vamos criar um novo mapa, vá New Map..">New">New Map..">em File->New Map...  Image 3
Neste momento, aparecerá uma janela como esta: Image 4
Nesta tela, você vai escolher a largura e altura do “tile” que vai compor o mapa. Além de determinar a largura e altura do Mapa! Ao clicar “Ok”, você já poderá criar seus mapas. Primeiramente, você vai precisar de uma malha de Tiles para construir o Mapa, para este artigo baixe esta malha aqui. Quando você baixar, basta arrastar e soltar a malha de tiles para a janela “Still Blocks”. Neste momento você está apto para criar seu mapa! Quando finalizá-lo, salve-o! Propriedades do blocos do Mapa Na janela Still Blocks, você vai poder encontrar os tiles que irão compor o mapa. Quando você clica 2 vezes sobre qualquer um dos tiles, uma janela de propriedades é aberta e uma série de configurações pode ser vista e salvas para que elas possam ser acessadas no seu jogo em “run-time”.
 Image 5 Um panorama sobre as propriedades de cada Tile As propriedades User 1 – 7 são úteis, por exemplo, para definir: · a velocidade na qual o personagem de seu jogo terá quando ele colidir com este tile; · se vai ser possível andar sobre esse tile ou não; · e outras necessidades que você precisar no seu jogo.
Versões do Leitor de Mapas para XNA
Versão 1.0 Na versão 1.0, é preciso deixar o mapa em uma pasta para o .FMP ser lido. Por simplicidade, eu coloquei o mapa(.FMP) na pasta Debug de meu Projeto, como mostra a foto abaixo: Image 6
A versão 1.0 contém um projeto de nome “LoaderMapFromMappy”, no qual não contém nenhuma regra de negócio de Jogo.
- Esse projeto possui o leitor de arquivo .FMP, e outras entidades que vão representar o mapa e seus elementos; - Formatos de Tile suportados para esta versão: Tiles retangulares.
Nesta versão não é suportado ainda:
- Renderização para Tiles Hexagonais ou Isométricos. - Renderização de múltiplas layers; só é possível ainda, renderizar os tiles da layer 0; - Você não vai poder ler em seu jogo, algumas informações definidas nas configurações do tiles(Blocos) do Mapa, a imagem abaixo mostra quais configurações ainda será possível ler em seu jogo:

Image 7
Imagem 7 - Os slots que não podem ser lidos no jogo estãos dentro do retângulo vermelho.
O download de um exemplo de mapa renderizado, juntamente com o projeto contendo o leitor e entidades relacionadas, pode ser baixado ao final do artigo na seção de Anexos. Versão 2.0 Para esta versão, foi incorporado um novo tipo de Asset chamado Map2D. Abaixo é mostardo um exemplo de como ler esse tipo de Asset: Map2D map2D = this.Content.Load<Map2D>("TestLevel1"); Suponha que você esteja dentro da classe Game. Com o asset lido, para renderizá-lo você precisar de uma instância da classe SpriteBatch. Abaixo segue um exemplo de um mapa renderizado: this.spriteBatch.Begin(); this.spriteBatch.Draw(gameTime, this.map2D, new Vector2(100, 100), Color.White); this.spriteBatch.End(); A versão 2.0 contém um projeto de nome “Mappy_Map2D”, no qual não contém nenhuma regra de negócio de Jogo.
- Os Formatos de Tile suportados ainda é permanece, sendo apenas: Tiles retangulares. Também foi incorporado a versão 2.0, um projeto do tipo “Content Pipeline Extension Library”. Nele, se encontra:
o Importer para o .FMP; o Processor para o .FMP; e também o Writer responsável por gerar o .xnb, como mostra a imagem abaixo:
 Image 8
O Reader desse .xnb se encontra no Projeto “Mappy_Map2D”. Na versão 1.0, quem representava o mapa era a classe “MapLayer” agora na versão 2.0, que fica com essa função é a classe “Map2D”. Observe a imagem abaixo:  Image 9
Observe a seta vermelha, agora, para obter a imagem dos tiles, basta escreve o nome da textura no valor da propriedade “Tile Image Name”. A classe MapLayer possuía um método por “BuildSourceRectanglesTileStrip”, aonde era passado via parametro o número de linhas e colunas da imagem dos tiles, dentre outras informaçãoes.
Na versão 2.0, esse método foi abolido, assim como outros, e para informar o número de linhas e colunas da imagem dos tiles, basta você colocar um valor na propriedade Tile Rows(quantidade de linhas da imagem) e Tile Columns(quantidade de colunas da imagem). Lembre-se que quando você for criar um novo projeto “Windows Game”, você adicionar as devidas referências nos seus respectivos projetos. O projeto Mappy_Map2D você adiciona na pasta “References” do projeto do seu jogo. Já o Content Pipeline extendido para trabalhar com o .FMP você deve adicionar na pasta “References” do seu sub-Projeto denominado “Content”.
 Image 10
Versão 2.1
Novas features(características) adicionadas a esta versão:
Com base nos mais variados problemas que possam acontecer no uso deste Leitor, vários erros foram tratados e com identificação erros mais eficiente e de fácil compreensão!
O tratamento de erro foi incorporado nos parâmetros de entrada(veja Image 9) para o "Content Processor":
- Tile Rows
- Tile Columns
- Tile Image Name
Os mapas produzidos no Mappy, poderão rodar, a partir de agora, no Xbox 360.
Ao final deste artigo eu libero um Projeto demo na versão 2.1 com todas as novas features apresentadas acima.
Versão 2.2
A seguir, uma relação com as novas "features":
- Os blocos unsafe foram eliminados. Eu consegui fazer o trabalho "mais baixo nível" utilizando a classe BitConverter. E quando precisei utilizar "sizeof" eu utilizei este método: System.Runtime.InteropServices.Marshal.SizeOf
- Algums comentários foram modificados e colocados em inglês;
- O projeto de início(StartUp Projetct) é o projeto para rodar em Windows. Na versão 2.1, o padrão é o projeto para Xbox 360.
Versão 2.3
Nesta versão, pode-se obter as informação dos tiles(ver Image 7) que foram colocadas através do Mappy. Essas informações podem ser obtidas na classe Map2D, pelo método GetBlockInformation.
Acompanhe novos "releases" no CodePlex pelo link: http://xnalibrarymappymaps.codeplex.com/
Conclusões
Este artigo tem como objetivo expor uma maneira menos árdua, para as pessoas que pretendam fazer jogos utilizando um conjunto de "tiles", produzam seus jogos com um pouco mais de eficácia e tranquilidade.
Periodicamente serão lançadas versões com adições/melhorias do projeto(atualmente na Versão 2.3) que está sendo liberado na seção de anexos. Lembrando que no caso de alguém encontre bug(s), por favor, informar!
No Forum do SharpGames, foi aberta uma "thread" para discussão sobre assuntos pertinentes a este artigo. Clique aqui para discutir este artigo no forum do SharpGames.
Espero que tenha gostado e também, o que foi apresentado acima tenha sido útil para você!Dúvidas, Críticas e sugestões são bem-vindas! Obrigado! |