我目前正在开发 2D map 编辑器。每个图 block 都有一些属性,比如位置、碰撞等等。当然,我还需要保存 map 的列数和行数。
如果我可以保存 map 并稍后再次加载它,那就太好了。我想将 map 保存为单独的 .png 文件,并将约束保存在另一个文件中(瓷砖的坐标、瓷砖的宽度等...)。为此,我尝试使用 boost 属性树,将 map 保存到 xml 文件中。但这真的很慢,而且 xml 有几千行文本。有谁知道我如何解决这个问题的更好方法?我从来没有做过任何严肃的文件保存/加载。
这是我用来保存 map.xml 的一些测试代码:
注意:tilemap是一个二维 vector
std::vector< std::vector< Tile* > > m_map;
void TileMap::exportAsXML(std::string &filename)
{
boost::property_tree::ptree pt;
pt.put("map.filename", filename);
filename=filename+".xml";
pt.put("map.size.cols", m_cols);
pt.put("map.size.rows", m_rows);
pt.put("map.size.tile_width", m_tile_width);
pt.put("map.size.tile_height", m_tile_height);
int i=0;
BOOST_FOREACH( std::vector<Tile*> row, m_map )
{
BOOST_FOREACH( Tile* t, row )
{
pt.put("Tiles."+boost::lexical_cast<std::string>( i )+".posX", t->getProperty()->getPosX());
pt.put("Tiles."+boost::lexical_cast<std::string>( i )+".posY", t->getProperty()->getPosY());
pt.put("Tiles."+boost::lexical_cast<std::string>( i )+".blocks", t->getProperty()->getBlocks());
pt.put("Tiles."+boost::lexical_cast<std::string>( i )+".width", t->getProperty()->getWidth());
pt.put("Tiles."+boost::lexical_cast<std::string>( i )+".height", t->getProperty()->getHeight());
i++;
}
}
boost::property_tree::xml_writer_settings<char> settings('\t', 1);
write_xml(filename, pt, std::locale(), settings);
}
最佳答案
如果 xml 太大那么你可以尝试使用 json格式来保存文件。它比 xml 更紧凑,可能会为您节省一些行数。
如果这个解决方案不好,那么你必须编写自己的格式,文本或二进制,最快/最小的是二进制格式。如果您不希望保存可读并且不需要对这些文件进行版本控制,那么二进制是最佳选择。我认为您甚至可以找到一些二进制 xml 库,这样您就不必在代码中进行大量更改。
另一种选择是压缩 xml 文件。您可以集成 zlib并压缩文件,然后保存。这将产生令人惊讶的格式,因为可以很好地压缩具有大量冗余的文本文件。
关于c++ - 保存二维 map 的好方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20270008/