经典游戏 ue4 重制(5)扫雷 - 下

上半部分

上次我们介绍了扫雷游戏中 Controller 的几个工具函数,除此之外,我们还需要以下几个控制游戏流程的函数。

bfa53b419d17676241cf6b249e380c83ff1aa61b.png

Image02.png

Image03.png

正如函数名提示的,GameOver 和 Win 分别用于处理扫雷失败或成功的情况,DecrementMineLeft 用于在用户点开一个不含地雷的格子后更新计数。

Controller 中还有两个处理用户鼠标点击的函数。

用户可以通过右键点击标注地雷。这里通过 GetHitResult 取得用户点击的 BP_Block,并且调用其 Mark 函数。

左键则是点开地雷。先取得用户点击的是哪个 BP_Block,然后调用其 Uncover 函数。之后判断是否还有地雷剩余,如果地雷全被挖掉了,则游戏通关。

BP_Block 的 Mark 函数如下。操作包括,翻转当前的 Marked 标记位,之后根据最新的状态,在格子上显示“*”。

Uncover 函数稍复杂些。我们先将点击 BP_Block 的 Uncovered 置为 True,表明该 BP_Block 已经被点开。之后通过 BlockXYHasMine 判断该位置有没有地雷,如果有则直接 GameOver。如果没有,则调用 GetSurroundingCount 判断它周围的八个格子中包含几个地雷。如果它周围没有地雷,则继续点开周围的八个格子,如果有,则显示地雷数。

d509142fc3ed3f3076d71bb8ddbc938cb93c91fb.jpeg

DisplaySurroundingCount 函数如下。我们传入一个整形表示周围有多少颗地雷,然后在当前格子上显示出来即可,最后不要忘记更新剩余的不含地雷的格子数。

9259d13b60115ff9a97ffc4d326014e9fcbd5698.png

RemoveEmptyBlock 也是用于更新棋盘的函数。其中将当前格子的 StaticMesh 和字符串置空,最后更新剩余的格子数。

7e124a9f1fbc6377e1937e02a042ed4dbbdc9f34.png

最后我们来看看 UncoverSurroundings,我们将在其中点开某个格子周围的八个格子,看看其中是否有地雷。

我们首先从 SurroundingDelta 中取出周围八个格子的偏移量。

5cafb9eb5c244f6189ec958510efe19239ae890b.png

针对每一个偏移量,我们将其转换为坐标点,判断结果坐标是否有效,如果是有效的坐标,则取得相应的 BP_Block,并且更新其 Uncovered 标记位。

之后我们取得该 BP_BLock 周围的地雷数,如果他的周围有地雷,则调用 DisplaySurroundingCount 显示地雷数,如果它的周围仍然没有地雷,我们则首先嗲用 RemoveEmptyBlock 刷新它的 StaticMesh,之后嵌套调用 UncoverSurroundings 继续点开它周围的地雷。

扫雷的主要函数就是以上这些。因为我们已经多次使用这个 TopDown 模版,所以这里省略了在 Begin Play 时设置摄像机的步骤。

项目的代码可以在以下地址得到。因为不太清楚有否顺利剥离 Starter Content,所以使用遇到问题请告知。

下次介绍俄罗斯方块。

多谢分享这么精彩的内容。其实稍微diy一下,做一个游戏还是不错的

期待俄罗斯方块~;)