新しいゲームのレベルエディタをプログラミングしています。問題は、私は自分のデータを格納するためにどのような構造を使うべきかわからないということです。データ構造2D/3Dタイル配列C++
タイルベースのマップエンジンで、x座標とy座標とその位置のタイルのIDを使用します。
私は複数のレイヤーを持っています、マップはサイズ変更可能ですので、配列は私にいくつかの問題を引き起こす可能性があります。そのため、そのケースのstd :: vectorを選択しました。 多くの過負荷を防ぐために、タイルを追加するだけです。誰かがそれを配置したときにタイルが追加されます。タイルがなくなるとベクトルサイズがゼロになり、タイルが増えれば増えます。
struct tile {
unsigned short tile_id;
unsigned short tile_x;
unsigned short tile_y;
};
そして、私のベクトル:
std::vector<tile> tiles;
事は、私がそのx軸とy位置のタイルがすでにありますかどうかを確認する必要が新しいタイルを追加する前に、あります。
// Returns true/false if there is a tile at given position or not
bool Layer::has_tile_at(unsigned short x, unsigned short y) {
unsigned int i;
for (i = 0; i < tiles.size(); i++) {
if (tiles[i].tile_x == x && tiles[i].tile_y == y)
return true;
}
return false;
}
私の問題は、すべての配置のタイルのため、私が先頭に高速ですが、いくつかのタイルが置かれた後、実際にお尻の痛みを取得し、全体のベクトル、ループスルーしなければならないこと、です。
これまでの私のアプローチは大丈夫だと思いますか、それとももっとスマートでパフォーマンスの高いものがありますか?
使用するデータ構造は主にユースケースに依存するはずです。主に(x、y)の読み込みを行う場合は、行列が必要です(ベクトルのベクトルまたは配列の配列を使用する必要があります)。インデックス化されたアクセスが必要で、タイル上で簡単に反復処理が必要な場合は、おそらく2つのデータ構造内にデータを保持しますか?ベクタ内のタイルへのポインタを持つ2次元マップを簡単に実装することができるはずです。最初は空の、遅延ロード(x、y)アクセスです(データの安全性について覚えておいてください)。 – hauron
最後のステートメントはこれ以上説明できませんか?ありがとう! – elasticman
@elasticman彼はそうしました。答えを下に見てください。 – WhozCraig