0

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

我计划制作多人游戏,所以我认为最好让服务器向客户端发送玩家周围的所有图块,并且只发送客户端需要的信息:要渲染的纹理/精灵,以及要渲染的位置它。

为此,我假设创建自己的 TILE 类会很好,该类具有 tileType(草、沙、水等)并包含 10 个 TileObjects 的数组。TileObject 是一个包含三个变量的类:objectType(它是一个字符吗?一个项目?一棵树?一块岩石?),一个 int objectID(它与实际的对象相关联,因此它知道字符是“Leeroy Jenkins “然后可以将Leeroy的动画和方向发送给客户端进行渲染。)和一个objectPosition(来自Tile的X和Y。如果需要,这可以延伸到Tile之外。)

虽然我不确定如何处理大于单个图块的对象或角色(例如碰撞消耗许多图块的龙),但这听起来是最好的设计。

我应该使用什么类型的容器将 TileObjects 存储在 TILE 类中?现在我有一个数组,但我怀疑这对性能有好处吗?一些图块可能有 0 个 TileObject,而另一些则可能有 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(其中一些可能会不断移动,可以像丢弃/拾取物品一样被破坏或添加,还有一些可能像树或岩石一样保持静止)。

4

1 回答 1

0

我认为您应该map从世界坐标到世界vector坐标中包含的事物。

就像,如果我有一个Thing代表游戏空间中任何东西的类,以及一个Position带有xy参数的类,我会这样:

map<Position, vector<Thing>>

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

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

空间划分。如果我想弄清楚我周围有什么东西,我只需要在地图上查看九个不同的位置。如果我走另一条路,并且有一个大listThings 没有按它们所在的位置划分,我将不得不查看Thing游戏中的每一个单曲,以确保我能看到每一个Thing可能靠近我的单曲。

这提供了巨大的加速 1) 地图越大 2)Things存在的越多 3) 您需要的本地交互类型越复杂。


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

这甚至可能导致“龙”问题得到解决 - 如果Things在平面地图中并且仅参考存储在按位置地图中,您的龙可能在平面地图中有一个条目和四个参考(每个对应一个它占据的位置)在按位置映射中,都指向同一事物。然后你只需要编写小心不要与对象交互两次的代码,只是因为它碰巧在它正在考虑的两个位置找到它!

于 2013-06-06T06:26:20.487 回答