我正在实施游戏。 我有一张地图,分为描述地形图的单元格。每个单元格应该是类地形的一个实例。我需要序列化这个地图,文件必须尽可能小,因为它将通过互联网在玩家之间同步(如果可能的话,几个Mb)。 但 如果我以这种方式创建一个地图(大小为4500x3000个单元格),则该文件为百万个Mb。 所以我必须使用指针,因为大多数地形将完全相同;可能我会有大约30个不同的地形。 我有这个polist的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;
}
谢谢
答案 0 :(得分:0)
您的计划确实与您说完全相同,但不是您想要的。您必须了解C ++中的指针(在这里您可以阅读Pointers - C++ Documentation)。
在您的代码中,您确实将所有单元格转储到文件中。
如果要最小化文件大小,则必须考虑网格的结构。如果你说平均地图你将有近30个地形,那么可能是,没有必要保存你的大量数据,但使用一些命名系统(使用你的地形名称),使用另一种数据结构(对于例如QMap
)。