在上一章中,我们创建了一些方法,来存储河流经过一个地图单元的方位等信息。在这一章节中,我们先来创建移除地图单元内河流的一些相关方法。
首先创建一个方法,移除地图单元内河流的流出部分,如果检测到当前地图单元没有河流的流出,那就直接跳出。如果有河流的流出,进行修改后,将标记设置为false
并且刷新地图。这里实际移除河流的代码,会在之后的章节中完善。代码如下:
HexCell.cs1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
|
public void RemoveOutgoingRiver() { if (hasOutgoingRiver == false) { return; }
hasOutgoingRiver = false; Refresh(); }
|
如果当前地图单元有河流的流出,那么其相邻地图单元也一定会有河流的流入。根据处理流入的逻辑,用同样方法处理流出。代码如下:
HexCell.cs1 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();
HexCell neighbor = GetNeighbor(outgoingRiver); neighbor.hasIncomingRiver = false; neighbor.Refresh(); }
|
河流会延伸到地图之外么?
虽然有能实现这个功能,但我们不会这么做。所以也不用检查相邻地图单元存在。
移除当前地图单元的河流,只会影响它自身的外观,这与改变高度与颜色不同,我们不用考虑其对相邻地图单元造成的影响,所以我们只需要刷新当前的地图单元就可以了。代码如下:
HexCell.cs1 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; RefreshSelfOnly();
HexCell neighbor = GetNeighbor(outgoingRiver); neighbor.hasIncomingRiver = false; neighbor.RefreshSelfOnly(); }
|
这个RefershSelfOnly
方法目前就使用刷新当前你地图单元所在的地图块方法,因为当整个地图初始化时还没有对河流进行编辑,所以也不需要考虑此时地图块是否已赋值的问题。编辑河流后刷新自身的代码,会在之后的章节完善。代码如下:
HexCell.cs1 2 3 4 5 6 7 8
|
private void RefreshSelfOnly() { chunk.Refresh(); }
|
移除相邻流入河流的方法思路基本相同。代码如下:
HexCell.cs1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
|
public void RemoveIncomingRiver() {
if (hasIncomingRiver == false) { return; } hasIncomingRiver = false; RefreshSelfOnly();
HexCell neighbor = GetNeighbor(incomingRiver); neighbor.hasOutgoingRiver = false; neighbor.RefreshSelfOnly(); }
|
最后再添加一个方法,移除地图单元内的全部河流。代码如下:
HexCell.cs1 2 3 4 5 6 7 8
|
public void RemoveRiver() { RemoveOutgoingRiver(); RemoveIncomingRiver(); }
|
至此,我们就完成了移除地图单元内河流的方法。接下来的一章中,我们将创建给地图单元内添加河流的方法。
Github代码