6-12 创建连接区域的河道

  在上一章中,我们声明了一个常量用来存储河床最低点的偏移量。在这一章中,我们要使用这个偏移量来构建连接区域。
  首先回到HexMesh.cs甲苯中,在这里有构建连接区域的方法。当我们构建地图单元的时候,获取其河流的状态。如果存在流入或者流出的河流,那么我们就修改中间顶点的高度。让其变为河床的最低点。代码如下:

HexMesh.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
private void Triangulate(HexDirection direction, HexCell cell)
{


EdgeVertices e = new EdgeVertices(
center + HexMetrics.GetFirstSolidCorner(direction),
center + HexMetrics.GetSecondSolidCorner(direction)
);

//检测当前边缘是否有河流穿过
if (cell.HasRiverThroughEdge(direction))
{
//如果有河流穿过,就降低中间顶点的高度,使其成为河床最低点
e.v3.y = cell.StreamBedY;
}

TriangulateEdgeFan(center, e, cell.Color);


}

  通过上图我们发现,在连接区域产生了破面的情况。要填补这些破面,就要在进行三角构建连接区域的时候,同时要将相邻地图单元边上中央顶点的坐标也下降到相应高度。代码如下:

HexMesh.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
private void TriangulateConnection(HexDirection direction, HexCell cell, EdgeVertices e1)
{


EdgeVertices e2 = new EdgeVertices(e1.v1 + bridge, e1.v5 + bridge);

//使得相邻地图单元的中间顶点坐标也下降到河床最低点位置,不然会有破面产生
if (cell.HasRiverThroughEdge(direction))
{
e2.v3.y = neighbor.StreamBedY;
}


}

  现在,我们就可以通过按下鼠标左脚拖拽在地图上创建河流了。不过我们发现一个问题,就是河流穿过地图单元中央的时候,河流就收缩到一起了。这明显是不正确的,我们将会在接下来的章节修复这个问题。

[Github代码](