在游戏中,一般使用正方形网格管理二维场景中的各种物体,这种网格简单快速,但缺点就是相邻网格的间距是不均匀的,因为对角相邻的网格的间距要比左右相邻的间距要大。
一个解决方法是使用蜂窝状的六边形网格代替正方形网格,六边形相邻网格之间的距离是固定的,这个特性带来的好处显而易见,当我们需要通过网格广播消息时,六边形网格所覆盖的范围更加接近均匀。事实上,六边形网格的实际应用范围很广,比如无线通讯在塔台的覆盖范围计算上,就是使用的六边形网格,这也是手机也被被称为“蜂窝式移动电话”的原因。
六边形网格的间距是一致的
与正方形相比,六边形网格的计算要复杂一些,首先要解决的就是定位算法,也就是给出一个点的坐标,需要定位该点所在网格。如果使用正方形网格,一个除法就可以解决,但在六边形网格中,则要麻烦一些,我从网上搜了一些相关的文章,比如这里、这里和这里。而下面则是我给出的一个比较快速的算法。
首先是定义一下在一个场景中如何表达六边形网格系统中的“坐标”,如下图所示,在六边形网格中,仍然使用二维的x,y坐标定位一个网格,而且假设左上角第一个六边形为(0,0),中心点位于原点上。
然后按照下图所示,将网格划分成一个个矩形,可以看出,这些矩形有两种类型,分别是A和B。
开始计算式,先确定某点所在的矩形网格,