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:
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
ecol
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.