6-3 移除河流

  在上一章中,我们创建了一些方法,来存储河流经过一个地图单元的方位等信息。在这一章节中,我们先来创建移除地图单元内河流的一些相关方法。
  首先创建一个方法,移除地图单元内河流的流出部分,如果检测到当前地图单元没有河流的流出,那就直接跳出。如果有河流的流出,进行修改后,将标记设置为false并且刷新地图。这里实际移除河流的代码,会在之后的章节中完善。代码如下:

HexCell.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/// <summary>
/// 删除cell自身流出的河流
/// </summary>
public void RemoveOutgoingRiver()
{
//判断当前cell是否有流出的河流
//没有河流留出的话就直接跳出
if (hasOutgoingRiver == false)
{
return;
}

//有流出的河流,就将cell流出状态改为false,并刷新当前chunk
hasOutgoingRiver = false;
Refresh();
}

  如果当前地图单元有河流的流出,那么其相邻地图单元也一定会有河流的流入。根据处理流入的逻辑,用同样方法处理流出。代码如下:

HexCell.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
public void RemoveOutgoingRiver()
{
if (hasOutgoingRiver == false)
{
return;
}

hasOutgoingRiver = false;
Refresh();

//移除当前cell河流的流出部分,那就要同时移除相邻cell河流的流入部分
HexCell neighbor = GetNeighbor(outgoingRiver);
//将相邻cell流入的标记设置为false
neighbor.hasIncomingRiver = false;
//刷新相邻cell所在的chunk
neighbor.Refresh();
}

河流会延伸到地图之外么?
虽然有能实现这个功能,但我们不会这么做。所以也不用检查相邻地图单元存在。

  移除当前地图单元的河流,只会影响它自身的外观,这与改变高度与颜色不同,我们不用考虑其对相邻地图单元造成的影响,所以我们只需要刷新当前的地图单元就可以了。代码如下:

HexCell.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public void RemoveOutgoingRiver()
{
if (hasOutgoingRiver == false)
{
return;
}

hasOutgoingRiver = false;
//Refresh();
//与改变高度和颜色不同,移除河流只会影响自身,所以只需要刷新自身mesh即可
//与其相邻的cell同理
RefreshSelfOnly();

HexCell neighbor = GetNeighbor(outgoingRiver);
neighbor.hasIncomingRiver = false;
//刷新相邻cell所在的chunk
//neighbor.Refresh();
neighbor.RefreshSelfOnly();
}

  这个RefershSelfOnly方法目前就使用刷新当前你地图单元所在的地图块方法,因为当整个地图初始化时还没有对河流进行编辑,所以也不需要考虑此时地图块是否已赋值的问题。编辑河流后刷新自身的代码,会在之后的章节完善。代码如下:

HexCell.cs
1
2
3
4
5
6
7
8
/// <summary>
/// 刷新cell自身的mesh
/// </summary>
private void RefreshSelfOnly()
{
//当前并未完善河流编辑功能,目前先使用刷新chunk的方法
chunk.Refresh();
}

  移除相邻流入河流的方法思路基本相同。代码如下:

HexCell.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
/// <summary>
/// 移除cell自身流入的河流
/// </summary>
public void RemoveIncomingRiver()
{
//思路与移除流出河流基本相同

if (hasIncomingRiver == false)
{
return;
}
hasIncomingRiver = false;
RefreshSelfOnly();

HexCell neighbor = GetNeighbor(incomingRiver);
neighbor.hasOutgoingRiver = false;
neighbor.RefreshSelfOnly();
}

  最后再添加一个方法,移除地图单元内的全部河流。代码如下:

HexCell.cs
1
2
3
4
5
6
7
8
/// <summary>
/// 移除cell自身流入和流出的河流
/// </summary>
public void RemoveRiver()
{
RemoveOutgoingRiver();
RemoveIncomingRiver();
}

  至此,我们就完成了移除地图单元内河流的方法。接下来的一章中,我们将创建给地图单元内添加河流的方法。

Github代码