泡沫射手克隆,存储/添加气泡的结构

我有几个问题试找出什么最好的数据结构来存储气泡的网格,以及如何连接新的气泡,当一个移动的球碰撞网格上的球。

我的第一个实现是创建一个二维数组,并填充一堆气泡。 然后我遍历整个数组,只有在当前气泡的所有方向上都有相邻的气泡时,才能在气泡之间建立连接。 在我建立了网格并建立了所有连接之后,我添加了每个气泡列表,以便在检测到碰撞时查找气泡之间的连接。

当一个移动的球与一个静止的球碰撞时,我在球之间创建了一个连接,然后从碰撞的球上执行recursionBFSsearch,find与我刚碰撞的球颜色相同的所有球。 这个工作,但不是非常防弹,因为当某些球被删除时,我经常断开球之间的连接,或者经常会有球组不会消失。

我的第二个实现是使用Hex网格。 我曾经在这里读过类似的问题,在这里用户建议使用六角形网格,所以我想我会尝试这种方法。 再次,我创建了一个包含一堆泡泡的二维数组,并尝试运行一个映射器,它根据它们在网格中的位置将某些球映射到彼此。 我还有一系列的连接问题,经常会导致连接断开或没有正确连接。

这里有很多边缘案例,我仍然坚持在即时通讯不完全确定如何解决。 例如,当我碰撞的球与另一个球相连时,如果这个球与另一个球同时碰撞,该如何处理。 或者我应该如何在特定区域内寻找球。

我觉得我只是推翻了这一点,并使问题的方式更复杂,然后它需要。

我会尝试使用N元树结构。 气泡堆积在一个歪斜的形成。 如果你拿一个泡泡和其他泡泡包围,你只能得到6个可能的连接:左上,右上,左上,右下,左下和右下。 与2d网格对比,你会得到8个可能的连接:左上,中上,右上,左上,右下,左下,中下和右下。 这应该使得使用2d数组有点繁琐,以跟踪节点之间的正确连接。

我的方法是使每个节点有6个连接,使树足够大,以表示整个播放区域,允许空节点,并允许边缘节点或空节点连接。

我现在回来回答我自己的问题。

我结束了使用在这个答案中find的资源:

创建一个冻结的气泡克隆

我把我的二维网格数组转换成一个hex数组。 我仍然使用二维数组索引到hex,但我一定要确保我的hex网格函数在一个奇怪的R布局,并且我索引我的arrays正确的基础上,布局。 所有这些信息在本文中都被转化了:

http://www.redblobgames.com/grids/hexagons/

为了检测碰撞,我最终做了一些math计算,试图找出碰撞球接触到的hex的哪一部分。

这样做的一个方法是:

我如何在XNA中实现六边形地图拾取?