ゲームを実装しています。地形図を表すセルに分割された地図があります。各セルは、クラスの地形のインスタンスである必要があります。このマップをシリアル化する必要があり、プレイヤー間でインターネット経由で同期されるため、ファイルはできるだけ小さくする必要があります (可能であれば数 Mb)。しかし、この方法で (サイズ 4500x3000 セルの) マップを作成すると、ファイルは数百 MB になります。したがって、ほとんどの地形はまったく同じであるため、ポインターを使用する必要があります。おそらく私は約 30 の異なる地形を持つでしょう。私はこの Qlist of poitners を持っています。問題は、すべての要素を作成したかのように、出力されるファイルが大きくなり、その理由がわかりません。これが私のコードです。おそらくいくつかの大きな間違いがあります。
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;
}
ありがとうございました