Я программирую редактор уровней для новой игры. Проблема в том, что я не уверен, какую структуру использовать для хранения моих данных.Структура данных 2d/3d массив плиток C++
Это движок карты на основе плитки с использованием координат x и y и идентификатор для плитки в этом положении.
У меня есть несколько слоев, карта может быть изменена, поэтому массив может вызвать у меня некоторые проблемы, поэтому я выбрал для этого случая std :: vector. Чтобы предотвратить большую перегрузку, я добавляю только плитку, когда кто-то ее помещает, поэтому размер вектора равен нулю, если нет фрагментов и увеличивается количество размещенных фрагментов.
struct tile {
unsigned short tile_id;
unsigned short tile_x;
unsigned short tile_y;
};
И мой вектор:
std::vector<tile> tiles;
Дело в том, прежде чем добавить новую плитку мне нужно проверить, если уже есть плитка на этой х- и у-положении.
// 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), то, возможно, вам нужна матрица (будь то вектор векторов или просто массив массивов). Если вам нужен индексированный доступ и легко итерация над плитами, возможно, данные хранятся в двух структурах данных?Вы должны иметь возможность легко реализовать карту 2d с указателями на плитки в векторном - изначально пустым, лениво загруженным (x, y) доступом (помните о безопасности данных!) – hauron
Не могли бы вы объяснить свое последнее утверждение дальше? Благодаря! – elasticman
@elasticman Он так и сделал. Посмотрите внизу на ответы. – WhozCraig