3-8 设置连接类型

  在上一章中完成了矩形连接区域的阶梯化,但是我们发现如果两个相邻的地图单元高度相同,那么他们之间的矩形连接区域可以不用阶梯化,从而避免产生多于的三角面片。相反的,如果两个相邻的地图单元高度相差较大的时候,3段阶梯又会被拉伸,感觉并不美观。
  根据这个现象,我们将不同高度的连接分为三个类型:Flat(平坦)、Slop(倾斜)、Cliff(陡峭),并为其创建一个新的枚举类型。

HexEdgeType.cs
1
2
3
4
5
6
7
//两个cell之间的高度差分类
public enum HexEdgeType
{
Flat,//高度差为0
Slope,//高度差为1
Cliff//高度差大于1
}

  为了确认相邻地图单元的连接类型,在HexMetrice.cs中添加一个方法,通过计算两个相邻地图单元的高度差,来判断他们的连接类型。

HexMetrice.cs
1
2
3
4
5
6
7
8
9
/// <summary>
/// 判断两个相邻的cell之间的高度差
/// </summary>
/// <param name="elevation1">cell自身</param>
/// <param name="elevation2">相邻的cell</param>
/// <returns>两个相邻cell的连接类型</returns>
public static HexEdgeType GetEdgeType(int elevation1, int elevation2)
{
}

  如果两个相邻地图单元的高度相同,那么他们之间的连接类型就为Flat(平坦)。

HexMetrice.cs
1
2
3
4
5
6
7
8
public static HexEdgeType GetEdgeType(int elevation1, int elevation2)
{
//两个相邻cell高度相同,为Flat
if (elevation1 == elevation2)
{
return HexEdgeType.Flat;
}
}

  如果两个相邻地图单元的高度差值为1,那么就是Slop(倾斜)。除此之外,均为Cliff(陡峭)。

HexMetrice.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
public static HexEdgeType GetEdgeType(int elevation1, int elevation2)
{


//两个相邻cell高度差1,为Slope
int delta = elevation2 - elevation1;
if (delta == 1 || delta == -1)
{
return HexEdgeType.Slope;
}

//剩下的情况,均为Cliff
return HexEdgeType.Cliff;
}

  接下来回到HexCell.cs中,创建一个方法,用来获取指定方位相邻地图单元的连接类型。

HexCell.cs
1
2
3
4
5
6
7
8
9
10
11
/// <summary>
/// 获取指定方位相邻cell 的连接类型(HexEdgeType)
/// </summary>
/// <param name="direction">指定的相邻方位</param>
/// <returns></returns>
public HexEdgeType GetEdgeType(HexDirection direction)
{
return HexMetrics.GetEdgeType(
elevation, neighbors[(int)direction].elevation
);
}

  现在,我们对各种不同高差的连接类型进·完成了分类,并创建了一个获取相邻地图单元连接类型的方法。在接下来的一章中,我们将使用这些代码,只对Slop(倾斜)类型的连接进行阶梯化。

是否需要在所有方向上都要检查存不存在相邻单元格?
你可能最终会在恰好位于地图边界上的方向获取边缘类型。在那种情况下是没有相邻地图单元的,同时我们也会得到一个空引用异常。当然可以在方法内就检查这个,然后如果发生这种情况抛出某种异常。但是那种情况下,异常就已经发生了,所以这是多此一举,除非你想抛出一个自定义的异常类型。
需要明确的是,我们只会在我们知道不是处理地图边界的时候才会使用这个方法,如果在某些地方出错了,我们肯定会得到一个空引用异常。

Github代码