【发布时间】:2013-09-21 03:13:25
【问题描述】:
我觉得这是一个非常简单,几乎是愚蠢的问题。我只是忘记了我应该知道该怎么做。
我有存储在通用 GameObjectManager 中的 GameObjects。这些游戏对象有一个 ObjectID,它是一个简单的 int。
我需要能够在基于 2D 瓦片的世界中插入或删除这些游戏对象,其中每个瓦片都包含一个 ObjectID 的容器。
这样,我可以抓取一个特定的图块(例如,Tile[10][10]),然后通过从容器中读取来查看 Tile[10][10] 上的游戏对象。 (例如“啊,所以 Character#4302 和 Item#123 在 Tile[10][10]!”)
现在,每个“Tile”都是 MAP 的 Tiles 数组中的一个结构。
struct MapTile
{
std::vector <int> GameObject_MapList ; //list of Objects on this map location
TileTerrainType tileTerrainType; //GFX to display Grass, Sand, Water, Swamp, etc.
};
MapTile mlMap[100][100]; //map array
但是,我读到在任意添加/删除变量时不应使用向量。我不会删除数组中的第一个或最后一个变量。相反,我将不得不调用特定的 ObjectID 并将其从数组中的任何位置删除。
出于这个原因,我正在考虑使用不同的容器。 也许我太累了,但我可以就使用什么容器以及如何删除容器中的特定变量提出一些建议。
例如,GameObject 的 ObjectID 为“422”。 Tile[2][8] 包含一个容器,该容器按顺序具有以下整数:420、421、422、433、486、800。
我有一个函数:RemoveGameObjectFromMap(int ObjectID); 所以我需要它来删除 422,每当我输入 (RemoveGameObjectFromMap(422);
我曾经使用 MAP 容器,但那是不必要的。 Vector,根据 cplusplus.com 的说法,这对它不利。
【问题讨论】:
-
也许我很困惑,因为我没有正确处理我的课程。我想得越多,我就越意识到我应该允许 MAP 类完全访问 WORLD 类的 GameObjectManager。我这样做只是因为我以前的处理方式(保存实际游戏对象的 MAP)是因为 TILES 不再保存实际游戏对象,而是只保存它们的 int ObjectID。
-
矢量的好坏取决于很多因素。就像每个图块有多少个 ID(平均),插入、删除和查找的频率,有多少需要最小化内存使用,以及 100 个其他考虑因素。简而言之,没有简单的答案。在这种情况下,std::vector 的明显替代方案是 std::unordered_set (我假设您永远不想在同一个图块中多次使用相同的 ID)。
-
插入和删除是不变的。任何时候玩家移动一点点,它们都会被删除并插入到新的 MapTile 中。
-
是的! std::unordered_set 正是我所需要的。请将此作为您的答案,而不是您的评论,这样我就可以关闭它并给您积分。
-
嗯,我遇到了一个奇怪的错误。 “命名空间 std 中的 unordered_set 没有命名类型”
标签: c++ list vector iteration containers