我有一个基于2D瓦片的世界,它是使用一个简单的数组创建的: World100。
我计划让游戏成为多人游戏,所以我想让服务器向客户端发送玩家周围的所有瓷砖,并且只发送客户端需要的信息:渲染什么纹理/精灵,以及渲染它的位置。
要做到这一点,我假设这将是一个很好的我自己的瓦片类,它有一个tileType (草,沙,水等)。并保存10个TileObjects的数组。TileObject是一个包含三个变量的类: objectType (它是一个字符吗?一件物品?一棵树?一块石头?),一个int objectID (它链接到对象实际是什么,所以它知道这个角色是"Leeroy Jenkins“,然后可以将Leeroy的动画和方向发送到客户端进行渲染。)和objectPosition (磁贴中的X&Y)。如果需要,这可以扩展到Tile之外。)
虽然我不确定如何处理大于单个瓦片的物体或人物(例如龙,它的碰撞消耗了许多瓦片),但听起来像是最好的设计。
我应该使用哪种类型的容器来存储TILE类中的TileObjects?现在我有一个数组,但我怀疑这对性能有好处,对吗?某些平铺可能具有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 (其中一些可能会不断移动,可以销毁或添加,如下降/拾取物品,以及一些可能保持不动,如树或岩石)。
发布于 2013-06-06 14:26:20
我认为你应该有一个从世界坐标到世界坐标中包含的东西的map。
例如,如果我有一个类Thing来表示游戏中空间中的任何东西,以及一个带有x和y参数的Position类,我会有这样的结果:
map<Position, vector<Thing>>
为游戏中的每个位置初始化一个vector<Thing>,最初为空(总共10000个)。
这为您提供了一个有用的属性:
空间分区。如果我想弄清楚我周围有什么东西,我只需要在地图上查看九个不同的位置。如果我走另一条路,并且Things的一个大list没有按它们所在的位置进行划分,我将不得不查看游戏中的每个Thing,以确保我能看到我附近的每个Thing。
这提供了巨大的加速: 1)地图越大,2)存在的Things越多,3)你需要的越来越复杂的本地交互。
如果您有一个ThingID,并且需要获取与其关联的Thing,但不知道它在哪里,该怎么办?为了解决这个问题,你可以在ThingIDs到Things之间建立一个很大的map<int, Thing>,然后查看它。当然,我们在这里看到了一些冗余-我们可以将Thing存储在平面地图中,或者存储在by-Position地图中,让另一个只是对另一个的引用(在前一种情况下,只包含当前位置-在后一种情况下,只包含ThingID),它们必须保持同步。
这甚至可能导致“龙”问题的解决-如果Things在平面地图中,并且仅引用存储在按位置地图中,则您的龙在平面地图中可能有一个条目,而在按位置地图中有四个引用(每个位置对应一个),所有这些都指向相同的东西。然后,你只需要编写代码,小心不要与一个对象进行两次交互,因为它恰好在它考虑的两个位置找到了它!
https://stackoverflow.com/questions/16950784
复制相似问题