我正在编写一个游戏,其中大量对象将在平铺2D地图的区域上具有“区域效果”。
必备功能:
哪种数据结构最适用于此?
答案 0 :(得分:2)
通常取决于地图的密度。
如果您知道每个图块(或图块的主要部分)至少包含一个效果,则应使用常规网格 - 简单的2D图块阵列。
如果你的地图填充不足并且有很多空的瓷砖,那么使用一些spatial indexes像四叉树或R树或BSP树是有意义的。
答案 1 :(得分:2)
假设您确实同时发生了很多区域效果,并且它们将具有任意形状,我会这样做:
答案 2 :(得分:1)
答案 3 :(得分:1)
一些不依赖计算机科学的蛮力解决方案:
1000 x 1000不是太大 - 只是一个兆。电脑有演出。你可以有一个2d数组。字节中的每个位可以是“区域类型”。较大的“受影响区域”可能是另一点。如果您有合理数量的不同类型的区域,您仍然可以使用多字节位掩码。如果这变得荒谬,你可以使数组元素指向重叠区域类型对象的列表。但是你失去了效率。
你也可以实现一个稀疏数组 - 使用哈希表键(例如,键= 1000 * x + y) - 但这要慢很多倍。
如果您不介意编写花哨的计算机科学方法,那么它们通常会更好!
答案 4 :(得分:1)
如果您有一个已知的每个区域效果的最大范围,您可以使用您选择的数据结构并仅存储实际的源,这是针对正常的2D碰撞测试进行优化的。
然后,在检查拼贴上的效果时,只需检查(最大化数据结构的碰撞检测样式)所有效果源在最大范围内,然后应用定义的测试功能(例如,如果该区域是圆,检查距离是否小于常数;如果是方形,检查x和y距离是否均为常数。
如果您有一小部分(< 10)效果“字段”形状,您甚至可以在预先计算出的最大范围内为每个效果字段类型执行唯一的碰撞检测。