我应该使用什么类型的容器来容纳基于2D Tile的World's Tile对象?

时间:2013-06-05 22:11:56

标签: c++ stl containers

我有一个基于2D tile的世界,它是使用一个简单的数组创建的:World [100] [100]。

我计划制作游戏多人游戏,所以我认为让SERVER向玩家发送玩家周围的所有图块,只有客户需要的信息:渲染什么纹理/精灵,以及提升它的位置。

要做到这一点,我假设制作我自己的TILE类是很好的,它有一个tileType(Grass,Sand,Water等)并且拥有一个包含10个TileObjects的数组。 TileObject是一个包含三个变量的类:objectType(它是一个字符吗?一个项目?一个树?一个摇滚?),一个int objectID(它链接到实际上的任何对象,因此它知道该字符是“Leeroy Jenkins” “然后可以将Leeroy的动画和方向发送到客户端进行渲染。”和objectPosition(来自Tile的X& Y.如果需要,可以扩展到Tile之外。)

虽然有了这个我不知道如何处理大于单个图块的对象或字符(例如一个碰撞消耗很多图块的龙)但它听起来像是最好的设计。

我应该使用什么类型的容器将TileObjects存储在TILE类中?现在我有一个阵列,但我怀疑这对性能有好处吗?一些图块可能有0个TileObjects,而其他图块可能有5个。我使用了10,因为我严重怀疑任何事情都不会超过<10。

 class Tile
 {
private:
    TileObject TileObjects[10]; //up to 10 objects on a single tile
    TileTerrainType tileTerrainType; //GFX to display Grass, Sand, Water, Swamp, etc.
 }

我已经阅读了许多不同的教程和书籍,他们争论完全不同的容器类型:矢量,地图,链接列表,数组。我只是不知道什么是最好的存储TileObjects(其中一些可能会不断移动,可以被销毁或添加,如丢弃/拾取项目,以及一些可能像树或岩石一样保持静止)。

1 个答案:

答案 0 :(得分:0)

我认为你应该有map来自世界各地的坐标,以及vector世界上那些坐标所包含的内容。

如果我有一个类Thing代表可以在游戏空间中的任何内容,以及一个Positionxy参数,我会这样:

map<Position, vector<Thing>>

初始化为一个vector<Thing>,最初为空,对于游戏中的每个位置(全部10000个)。

这为您提供了一个有用的属性:

空间分区。如果我想知道我周围的事情,我只需要在九个不同的位置查看地图。如果我要走另一条路,并且有listThing Thing未分区的地方,我必须在游戏中查看每一个Thing以确保我会看到可能靠近我的每一个Things

这提供了巨大的加速1)地图越大2)存在的ThingID越多3)你需要越来越复杂的本地交互。


如果您有Thing并且需要将map<int, Thing>与之关联,而不知道它在哪里,该怎么办?要解决此问题,您可以ThingID Thing Thing个到Things s并查看。当然,我们在这里看到一些冗余 - 我们可以将{{1}}存储在平面地图中,或者存储在按位置的地图中,让另一个只是对另一个的引用(在前一种情况下,只包含当前位置 - 在后一种情况下,只包含ThingID),它们必须保持同步。

这甚至可能导致'龙'问题得到解决 - 如果{{1}}位于平面地图中且仅参考存储在位置地图中,则您的龙可能在平面地图中有一个条目,在位置图中的四个引用(它占据的每个位置各一个),都指向同一个东西。然后你只需要编写代码,小心不要与对象交互两次,只是因为它碰巧在它正在考虑的两个位置找到它!