1

ゲームを実装しています。地形図を表すセルに分割された地図があります。各セルは、クラスの地形のインスタンスである必要があります。このマップをシリアル化する必要があり、プレイヤー間でインターネット経由で同期されるため、ファイルはできるだけ小さくする必要があります (可能であれば数 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; }

ありがとうございました

4

1 に答える 1

0

あなたのプログラムはあなたが言ったことを正確に実行しますが、あなたが望んでいることはしません。C++ のポインターとは何かを理解する必要があります (ここでPointers - C++ Documentationについて読むことができます)。

コードでは、実際にすべてのセルをファイルにダンプします。

ファイルサイズを最小限に抑えたい場合は、グリッドの構造を考慮する必要があります。平均的なマップでは 30 近くの地形があると言うなら、そうかもしれませんが、大量のデータを保存する必要はありませんが、何らかの命名システム (地形に名前を使用) を使用したり、別のデータ構造を使用したりします (地形に名前を使用)。例QMap)。

うまくいけば、あなたは私の考えを理解するでしょう! 幸運を!

于 2013-03-02T20:17:56.383 に答える