1

我正在实施一个游戏。我有一张地图,分为描述地形图的单元格。每个单元都应该是类地形的一个实例。我需要序列化这张地图,并且文件必须尽可能小,因为它将通过互联网在玩家之间同步(如果可能的话,几 Mb)。但是,如果我以这种方式创建地图(大小为 4500x3000 单元格),则文件为数百 Mb。所以我必须使用指针,因为大部分地形都是一样的;可能我会有大约 30 种不同的地形。我有这个poitners Qlist,问题是出来的文件和我创建所有元素一样大,我不明白为什么。这是我的代码,可能有一些大错误。

map.hpp #ifndef MAP_HPP #define MAP_HPP #include "include.hpp" #include "terrain.hpp" class map { public: map(); map(unsigned int width, unsigned int height); QList<terrain*> get_grid(); void let_snow(unsigned int x, unsigned int y); void display_snow_map(); void save(); void load(); private: QList<terrain*> grid_; unsigned int width_; unsigned int height_; }; ---------------------------------- map.cpp #include "map.hpp" map::map() {} map::map(unsigned int width, unsigned int height) { width_=width; height_=height; for(unsigned int i=0; i<height; i++) { for(unsigned int j=0; j<width; j++) { grid_.append(new terrain(1,0,j,i)); } } } void map::save() { QFile save_file("map.brt"); save_file.open(QIODevice::WriteOnly); QDataStream out(&save_file); out << grid_ << width_ << height_; save_file.close(); } void map::load() { QFile load_file("map.brt"); load_file.open(QIODevice::ReadOnly); QDataStream in(&load_file); in >> grid_ >> width_ >> height_; load_file.close(); } ---------------------------- terrain.hpp #ifndef TERRAIN_HPP #define TERRAIN_HPP #include "include.hpp" class terrain { public: terrain(); terrain(qint8 type, qint8 snow, qint16 x, qint16 y); qint8 get_type(); qint8 get_snow(); qint16 get_xcoord(); qint16 get_ycoord(); void set_snow(qint8 snow); void set_xcoord(qint16 x); void set_ycoord(qint16 y); void save(QDataStream &out); void load(); friend QDataStream &operator <<(QDataStream &out, const terrain &ter); friend QDataStream &operator >>(QDataStream &in, terrain &ter); friend QDataStream &operator <<(QDataStream &out, const terrain *ter); friend QDataStream &operator >>(QDataStream &in, terrain *ter); private: qint8 type_; qint8 snow_; qint16 xcoord_; qint16 ycoord_; }; #endif // TERRAIN_HPP ----------------------------------------- terrain.cpp QDataStream &operator <<(QDataStream &out, const terrain &ter) { out << ter.xcoord_ << ter.ycoord_ << ter.type_ << ter.snow_; return out; } QDataStream &operator >>(QDataStream &in, terrain &ter) { in >> ter.xcoord_ >> ter.ycoord_ >> ter.type_ >> ter.snow_; return in; } QDataStream &operator <<(QDataStream &out, const terrain *ter) { out << ter->xcoord_ << ter->ycoord_ << ter->type_ << ter->snow_; return out; } QDataStream &operator >>(QDataStream &in, terrain *ter) { in >> ter->xcoord_ >> ter->ycoord_ >> ter->type_ >> ter->snow_; return in; }

谢谢

4

1 回答 1

0

你的程序完全按照你说的做,但不是你想要的。您必须了解什么是 C++ 中的指针(在这里您可以阅读指针 - C++ 文档)。

在您的代码中,您确实将所有单元格转储到文件中。

如果要最小化文件大小,则必须考虑网格的结构。如果您说在平均地图中您将拥有近 30 个地形,那么可能是,没有必要保存大量数据,而是使用一些命名系统(为您的地形使用名称),使用另一种数据结构(例如例子QMap)。

希望,你会明白我的想法!祝你好运!

于 2013-03-02T20:17:56.383 回答