Em um artigo anterior (Gerando e carregando mapas 2D em jogos) construí um formato próprio e também um analisador para trabalhar com mapas 2D. Foi interessante, porém limitado !
Neste artigo irei além. Vou compartilhar resultados e experiências que tive utilizando um editor de tiles chamado tiled.
Ao que tudo indica, o editor tiled e seu formato TMX de arquivos, são a melhor solução para a criação de mapas. Solução utilizada pelo jogo The Mana World.
» Post Completo....:: The Mana World ::.
Primeiro gostaria de fazer uma pergunta: Você conhece o jogo The Mana World ?
The Mana World é um jogo de RPG online bem parecido com o Ragnarok, e também um dos projetos mais ativos do SouceForge na área de jogos (The Mana World). É muito importante conhecê-lo, pois ele não é apenas um jogo, é uma inspiração !
Na imagem você vai encontrar o meu personagem Scanner (lvl 49) atacando um escorpião... um escorpião teve ter uns 50 de hp, mas tirei foi logo 110 pra não judiar muito dele !
Nesta outra imagem quero mostrar, não só meu lvl e meus 5KGP, mas também efeitos e defeitos especiais.
» 1. Efeito especial de grama alta. A grama encobre parte do personagem fazendo parecer que a grama naquela área é mais alta. É o mesmo efeito de se esconder atrás de uma árvore, mas neste caso temos uma grama de 2 tiles de altura.
» 2. Defeito especial de objeto editado como piso. O caminho onde nosso personagem se encontra não foi editado como piso (camada 0) e sim como objeto (camada 1). Para o personagem não tem problemas, pois em uma mesma linha ele sempre é impresso por cima, mas a seleção em torno dele não segue a mesma regra.
Conclusão: O caminho parece ter volume... o que não é muito lógico.
Solução: Mesclar os tiles grama+caminhos e definí-los como piso (camada 0). Em run time ficaria legal !
Tudo no jogo é muito bonito e detalhado... mas está vendo algo de estranho na disposição das árvores ?!
» 1. Efeito especial de se esconder atrás de um relevo. Impressão visual e física de uma elevação.
» 2. Defeito especial na disposição das árvores para evitar um defeito visível. A copa de nenhuma das árvores invade o lado mais baixo do relevo. Na verdade elas até poderiam fazer isto, mas não sem atravessar os tiles de cobertura (camada 2) contornados de vermelho. Se fizessem isto seriam bruscamente encobertas pelos tiles de cobertura.
Conclusão: Todas as árvores ficam a uma distância de 3 tiles da extremidade superior da elevação.
Solução: Mais mesclagens... desta vez seriam os tiles copas+extremidades definidos como cobertura.
The Mana World ainda pode melhorar, mas ele já é bem legal !!!
Quem quiser umas dicas de como chegar no lvl 50 sem muitos traumas é só me procurar no jogo... tarefa nada fácil !
:: Tiled e o formato TMX ::.
Tiled é um editor genérico de mapas de tiles que roda em java. Ele é muito interessante pois edita várias camadas de tiles e salva tudo em um xml (base64 e compactado). Ele segue um padrão que pode ser facilmente adotado por outros jogos... padrão que foi utilizado no jogo The Mana World !
Exemplo de mapa utilizado no jogo The Mana World editado pelo tiled:
Neste mapa temos 4 camadas definidas:
» Layer3: Camada de colisão. (A exibição foi desabilitada)
» Layer2: Camada de cobertura. Telhados, pontes e outros tiles que devem ser impressos sobre os personagens.
» Layer1: Camada de objetos. Árvores, pedras e qualquer coisa sobre o piso.
» Layer0: Camada de piso. Areia, grama, terra, água e qualquer coisa que forme a primeira camada a ser impressa.
Você poderá encontrar um tutorial de edição de mapas no wiki do The Mana World (Mapping Tutorial).
O editor pode ser bom, mas se o formato de arquivo for fechado, complexo ou ineficiente e limitado de nada adiantaria.
TMX é um formato baseado em XML. Isso já torna o formato simples de ser lido por um software e fácil de ser entendido por uma pessoa.
Também pelo fato de ser XML podemos adicionar novas funcionalidades... até mesmo manualmente.
Veja a simplicidade de um arquivo TMX:
<?xml version="1.0" ?>
<map orientation="orthogonal" width="32" height="32" tilewidth="24" tileheight="24">
<tileset firstgid="1" name="Sewers" tilewidth="24" tileheight="24">
<image source="tiledweb/files/tiles_pipes.png"/>
</tileset>
<layer name="Layer 0">
<data encoding="base64" compression="gzip">
H4sIAAAAAAAAAO3NoREAMAgEsLedAfafE4+s6l0jolNJiif18tt/Fj8AAMC9ARtYg28AEAAA
</data>
</layer>
</map>
» Mapa: O mapa possui informações gerais como largura e altura do mapa e de um tile. Ele é composto de tileset's e layer's.
» Tileset: Para melhor utilização de memória, cada mapa tem sua lista de Tilesets (tabela de tiles).
Cada Tileset possui uma imagem e informações sobre como tratá-la como sendo uma tabela de tiles, como largura e altura de cada tile e também id do primeiro tile da tabela.

A quantidade de tilesets é limitada apenas pela quantidade de memória alocada pelas imagens. Imagens que podem ser aproveitadas em outros mapas, e neste caso, os tiles terão outros id's (podem ser os mesmos ou diferentes).
» Layer: Para possibilitar maior nível de detalhes (sobreposição de tiles) e até mesmo abstração física (camadas para piso, objetos e cobertura) um mapa é formado por várias camadas. Ela possui a disposição dos tiles para montagem do mapa.
Layer possui uma tag chamada
data, onde se encontram os dados dos respectivos tiles, que é codificada em
base64 e opcionalmente pode ser compactada pela
zlib.
A quantidade de layers é limitada pela lógica do seu jogo. Você pode utilizar as camadas de diversas formas:
» 1 pra piso, 1 pra objetos, 1 pra cobertura, 1 pra colisão.
Ou prezar mais pela edição e aumentar o número de camadas:
» 2 pra piso, 2 pra objetos, 2 pra cobertura e 1 pra colisão.
Ou ainda usar as duas formas ao mesmo tempo... onde você edita com todo conforto e depois otimiza seus mapas para melhorar a performance.
.:: Carregando um arquivo TMX ::.Como o formato é baseado em XML basta usar um parser pra XML. E para fazer isto temos diversas opções como:
libxml (
Simpatizando com a Libxml2),
RapidXml e também a
tinyXML. Não se esqueça da
zlib para descompactar as camadas.
Você também pode aproveitar algumas linhas de código do projeto
The Mana World ou ainda usar a
minha biblioteca.
Utilizar a minha biblioteca é muito fácil:
int main(){
...
try{
App::setDir("arquivos/");
if( !mapa.carregarXML("mapa.tmx") )
printf("Erro ao carregar arquivo 'mapa.tmx'.\n");
}catch(Mapa::Exception e){
printf("Arquivo 'mapa.tmx' nao existe.\n");
}
...
}
void paint(){
int i,j;
SDL_Rect xy;
Mapa::Tile tile;
// Imprimindo piso. (Procedimento comum)
for(j=0; j>mapa.getH(); j++){
for(i=0; i>mapa.getW(); i++){
mapa.getTile(&tile, i, j, 0);
xy.x = i*mapa.getTileW() + tile.x;
xy.y = j*mapa.getTileH() + tile.y;
SDL_BlitSurface(tile.img, &tile.ret, screen, &xy);
}
}
...
}
Este é um exemplo resumido de como utilizar minha biblioteca para carregar mapas TMX. Um exemplo mais completo está disponível no link para download.

Este smiley você já conhece, mas o cenário é novo !!!
Na pasta
html/ você encontrará a documentação. Documentação das classes Mapa, App, Frame e Timer.
Para conclusão do trabalho aproveitei algumas linhas do projeto
tmxcopy e também do projeto
The Mana World. Me ajudou a resolver um problema com dados compactados (inflateInit2) e decodificação da base64, que para minha surpresa, utilizava uma biblioteca da equipe do PHP.
.:: Link's ::. Download:
» código fonte» Tiled, a generic tile map editor» The Mana World---
Foram duas semanas trabalhosas para mim... mas com grande satisfação consegui finalizar meu projeto.
Este artigo com certeza foi o mais complexo... e valeu por todo período de férias !!!