3-8 设置连接类型
在上一章中完成了矩形连接区域的阶梯化,但是我们发现如果两个相邻的地图单元高度相同,那么他们之间的矩形连接区域可以不用阶梯化,从而避免产生多于的三角面片。相反的,如果两个相邻的地图单元高度相差较大的时候,3段阶梯又会被拉伸,感觉并不美观。
根据这个现象,我们将不同高度的连接分为三个类型:Flat(平坦)、Slop(倾斜)、Cliff(陡峭),并为其创建一个新的枚举类型。
1 | //两个cell之间的高度差分类 |
为了确认相邻地图单元的连接类型,在HexMetrice.cs
中添加一个方法,通过计算两个相邻地图单元的高度差,来判断他们的连接类型。
1 | /// <summary> |
如果两个相邻地图单元的高度相同,那么他们之间的连接类型就为Flat(平坦)。
1 | public static HexEdgeType GetEdgeType(int elevation1, int elevation2) |
如果两个相邻地图单元的高度差值为1,那么就是Slop(倾斜)。除此之外,均为Cliff(陡峭)。
1 | public static HexEdgeType GetEdgeType(int elevation1, int elevation2) |
接下来回到HexCell.cs
中,创建一个方法,用来获取指定方位相邻地图单元的连接类型。
1 | /// <summary> |
现在,我们对各种不同高差的连接类型进·完成了分类,并创建了一个获取相邻地图单元连接类型的方法。在接下来的一章中,我们将使用这些代码,只对Slop(倾斜)类型的连接进行阶梯化。
是否需要在所有方向上都要检查存不存在相邻单元格?
你可能最终会在恰好位于地图边界上的方向获取边缘类型。在那种情况下是没有相邻地图单元的,同时我们也会得到一个空引用异常。当然可以在方法内就检查这个,然后如果发生这种情况抛出某种异常。但是那种情况下,异常就已经发生了,所以这是多此一举,除非你想抛出一个自定义的异常类型。
需要明确的是,我们只会在我们知道不是处理地图边界的时候才会使用这个方法,如果在某些地方出错了,我们肯定会得到一个空引用异常。