6-4 添加河流

  在上一章中,我们完成了移除地图单元内河流的方法。在这一章中,我们将创建在地图单元内添加河流的方法。要实现添加河流的功能,
  要实现z唉地图单元内添加河流的功能,只需要一个方法设置地图单元内流出方向的河流。这个方法应该覆盖之前流出方向的河流,并设置相应的相邻地图单元的流入方向的河流。
  首先,当要设置的方向已经存在河流时直接跳出。代码如下:

HexCell.cs
1
2
3
4
5
6
7
8
9
10
11
12
/// <summary>
/// 创建一条流出当前cell的河流
/// </summary>
/// <param name="direction">流出河流的方位</param>
public void SetOutgoingRiver(HexDirection direction)
{
//如果当前cell内有流出的河流,并且流出的方向与入参给出的方向相同,直接跳出
if (hasOutgoingRiver && outgoingRiver == direction)
{
return;
}
}

  然后得确保在流出方向上存在一个相邻的地图单元。并且河流不能向着更高的位置流动,所以检测到相邻地图单元高于当前地图单元时时跳出方法。代码如下:

HexCell.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public void SetOutgoingRiver(HexDirection direction)
{
if (hasOutgoingRiver && outgoingRiver == direction)
{
return;
}

//与移除河流思路相似,同时为相邻的cell添加流入的河流
HexCell neighbor = GetNeighbor(direction);
//这里注意,如果没有相邻的cell,或者相邻的cell高于当前cell,都不可以创建河流
//河流是不会从低处流向高处的
if (!neighbor || elevation < neighbor.elevation)
{
return;
}
}

  接下来,清除之前流出方向不同的河流。并且当前地图单元中流入的河流方向,与新的流出的方向相同,那么还要移除当前地图单元中流入的河流。代码如下:

HexCell.cs
1
2
3
4
5
6
7
8
9
10
11
12
public void SetOutgoingRiver(HexDirection direction)
{


//移除当前cell中,与入参方向不同的那个流出的河流
RemoveOutgoingRiver();
//如果入参河流的方向,与流入当前cell河流的方向相同,那么还要移除流入当前cell 的河流
if (hasIncomingRiver && incomingRiver == direction)
{
RemoveIncomingRiver();
}
}

  然后设置流出河流标记和方向,并刷新当前地图单元。代码如下:

HexCell.cs
1
2
3
4
5
6
7
8
9
public void SetOutgoingRiver(HexDirection direction)
{


//设置流出标记和方向,并刷新当前cell
hasOutgoingRiver = true;
outgoingRiver = direction;
RefreshSelfOnly();
}

  最后,当相邻地图单元中已经有流入的河流时,移除它并设置新的流入河流。代码如下:

HexCell.cs
1
2
3
4
5
6
7
8
9
10
public void SetOutgoingRiver(HexDirection direction)
{


//移除相邻cell中旧的流入河流,设置流入标记和新的方位,并且刷新相邻的cell
neighbor.RemoveIncomingRiver();
neighbor.hasIncomingRiver = true;
neighbor.incomingRiver = direction.Opposite();
neighbor.RefreshSelfOnly();
}

  至此,我们就完成了在地图单元内创建河流的基本方法了。这些方法目前只是创建河流的基本思路,在之后的章节中,我们将逐步完善这些方法。在下一章中,我们将添加一些代码,来防止河流逆流的情况发生。

Github代码