【问题标题】:What type of Container should I use to hold a 2D Tile Based World's Tile Objects?我应该使用什么类型的容器来保存基于 2D Tile 的 World's Tile Objects?
【发布时间】:2013-06-01 19:03:26
【问题描述】:

我有一个基于 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 是因为我严重怀疑任何东西都不会超过

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

我阅读了许多不同的教程和书籍,它们争论完全不同的容器类型:向量、映射、链接列表、数组。我只是不知道存储 TileObject 的最佳方式是什么(其中一些可能会不断移动,可能会像丢弃/拾取物品一样被破坏或添加,而另一些可能会像树或岩石一样保持静止)。

【问题讨论】:

  • 澄清一下 - 您使用 Tiles 来表示不动的东西(地形类型)和移动的东西(角色、物品)?

标签: c++ stl containers


【解决方案1】:

我认为您应该有一个从世界坐标到 vectormap,以了解世界上这些坐标所包含的内容。

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

map<Position, vector<Thing>>

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

这给了你一个有用的属性:

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

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


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

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

【讨论】:

  • 谢谢。很高兴知道有知识渊博的用户可以实际回答问题。感谢您成为能够回答实际问题的极少数用户之一。我失去了希望,因为大多数问题和答案充其量都是业余的。你的回答很专业,对我帮助很大。非常感谢。
  • @user15875 我不认为我的回答是“专业的”,这只是我从阅读中了解到的。我只是希望它可以帮助您概念化如何编写程序。 :)
猜你喜欢
  • 1970-01-01
  • 2013-09-02
  • 2021-12-25
  • 2013-09-21
  • 1970-01-01
  • 2017-07-17
  • 2010-12-23
  • 2011-01-12
  • 1970-01-01
相关资源
最近更新 更多