【发布时间】:2017-01-22 20:28:11
【问题描述】:
我正在为一款新游戏编写关卡编辑器。问题是,我不确定使用什么结构来存储我的数据。
它是一个基于瓦片的地图引擎,使用 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) 读取,那么也许您需要一个矩阵(通过向量的向量,或者只是数组数组)。如果您需要索引访问并轻松迭代图块,也许将数据保存在两个数据结构中?您应该能够轻松地实现带有指向向量内图块的指针的 2d 地图 - 最初是空的,在 (x,y) 访问时延迟加载(请记住数据安全!)
-
您能进一步解释您的最后陈述吗?谢谢!
-
@elasticman 他这样做了。往下看答案。
标签: c++ game-engine