Como Fazer Parser de .tmx com C++ para TileMap

Cansado de utilizar diversas soluções que só me deram dor de cabeça, resolvi escrever um parser de .tmx que funciona da maneira mais simples possível


Como Fazer Parser de .tmx com C++ para TileMap


Cansado de utilizar diversas soluções que só me deram dor de cabeça, resolvi escrever um parser de .tmx que funciona da maneira mais simples possível.

Trata-se de somente uma classe que possui uma função-membro estática(para não precisa instanciar) e ele retorna um vector<vector<int>> para implementar rapidamente.

A única dependência é o TinyXML2 que detalharemos mais à frente.

Para mais informações sobre o TinyXML2, veja essa publicação:

Como fazer parser de XML com TinyXML2 C++


Como utilizar o parser

Para utilizá-lo, você precisa ou instalar o TinyXML2 ou usá-lo sem instalar nesse repositório resumido que eu fiz um fork.

Só que o mais indicado mesmo é você instalá-lo no seu sistema. Abaixo exemplo de instalação no Ubuntu e derivados:

sudo apt install libtinyxml2-dev

Agora basta clonar com seu controle de versão preferido, exemplo com Git

git clone https://github.com/terroo/loadtmx

E copiar o arquivo loadtmx.hpp para seu projeto.

Para implementar basta criar um arquivo qualquer, incluir o loadtmx.hpp e utilizar ou o std::vector<std::vector<int>> ou o auto, exemplo:

vim main.cpp

#include "loadtmx.hpp"

int main( int argc , char **argv ){
  auto map = LoadTmx::tilemap("file.tmx");
}

Suponhamos que você possua esse .tmx e deseje fazer o parser de cada número dele:

Para fazer o download desse exemplo use o raw do Gist ou rodar o comando abaixo:

wget https://cutt.ly/tilemaptmx -O tilemap.tmx

Agora adicione ele ao seu código e imprima cada posição com um loop for:

#include "loadtmx.hpp"

int main( int argc , char **argv ){
  auto map = LoadTmx::tilemap("tilemap.tmx");

  for(auto &line : map){
    for(auto &col : line){
      std::cout << col; 
    } 
    std::cout << '\n';
  }
  return 0;
}

Para compilar rode:

g++ main.cpp -ltinyxml2
./a.out

A possível saída será justamente os números das posições que foram armazenados em line e col

Se quiser usar um loop clássico, seria:

for(std::size_t i{}; i < map.size(); ++i){
  for(std::size_t j{}; j < map[i].size(); ++j){
    std::cout << map[i][j];
  } 
  std::cout << '\n';
}

Se estiver usando o TinyXML2 local em vez de instalado no seu sistema, compile junto com o arquivo .cpp do TinyXML2, exemplo: g++ main.cpp tinyxml2/tinyxml2.cpp.

Observação: Ele já inclui o <iostream> e <vector> por padrão, então incluindo ele você já pode remover qualquer outra utilização dessas bibliotecas no seu código para evitar sobrecarga.


cpp cppdaily gamedev


Compartilhe


Nosso canal no Youtube

Inscreva-se


Marcos Oliveira

Marcos Oliveira

Desenvolvedor de software
https://github.com/terroo


Crie Aplicativos Gráficos para Linux e Windows com C++

Aprenda C++ Moderno e crie Games, Programas CLI, GUI e TUI de forma fácil.

Saiba Mais

Receba as novidades no seu e-mail!

Após cadastro e confirmação do e-mail, enviaremos semanalmente resumos e também sempre que houver novidades por aqui para que você mantenha-se atualizado!