Artigo
Leitor de Mapas gerados na Ferramenta Mappy para XNA
Construa o mapa de seus jogos na Ferramenta Mappy e importe seus mapas para o XNA
Enviado por Luciano José em 5/10/2008 0:00:00

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:


O Mappy possui várias bibliotecas para leitura e renderização dos mapas feitos com o editor que pode ser baixado aqui: http://www.tilemap.co.uk/mappy.php
 
 
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!
 
 

Arquivos Anexados
RunningMapFromMappy_Versao_1_0_XNA_3_Beta Download
RunningMapFromMappy_Version_2_0_XNA_3 Download
Version_2_1_LIBRARY_FOR_FMP_MAPs_XNA_3 Download
Version_2_2_LIBRARY_FOR_FMP_MAPs_XNA_3 Download
Version_2_3_LIBRARY_FOR_FMP_MAPs_XNA_3 Download
Sobre o Autor

lucianoJose
Luciano José
Administrador do SharpGames. Blog: lucianojosefj.spaces.live.com

Clique para avaliar:

Comentários
" oi Rubens. Obrigado por ter gostado :) Fizeram essa mesma pergunta lá no forum, dai eu respondi no forum mesmo. O link aqui: http://www.sharpgames.net/F%C3%B3rum/tabid/57/forumid/13/postid/403/scope/posts/Default.aspx"
Enviado por lucianoJose em 28/11/2008 19:13:13:
 
" eu implementei no meu projeto e nao consigo compilar luciano apresenta esta menssagem de erro.... Error 1 Cannot autodetect which importer to use for "mapa1.FMP". There are no importers which handle this file type. Specify the importer that handles this file type in your project. D:\Programação\XNA-C#\arkanoidxna\arkanoidxna\Content\mapa1.FMP arkanoidxna"
Enviado por Rubens em 28/11/2008 16:05:51:
 
" cara seu artigo quebrou um galho meu na montagem do meu jogo em xna... vou usar o mappy para fazer meus games em qualquer api"
Enviado por Rubens em 28/11/2008 14:33:44:
 

Adicione seu Comentário  Voltar
Translator
Logos do XBox 360, XNA e Games For Windows
Copyright 2010 por SharpgamesPolítica de Privacidade  |  Termos de Uso