再接上篇【Unity】瞎做个宝石迷阵吧!(2)——砖块交换
啊,终于来到了接近尾声的地方了。上次写到我们完成了宝石的交换,接下来我们就要对宝石的消除进行判断并实现消除。那赶紧进入正题吧。
之前我们说到宝石的交换,在每次的交换之后,我们便想要宝石进行一次消除的判断。首先我们在之前的Bricks脚本中加入点新的东西来让它在被触发时可以爆炸消除。
我们加入_end和_Boom这两个私有布尔变量来作为标记。然后再写了两个函数啦触发砖块的消除动画和毁坏脚本。当我们触发了Boom函数时,将控制改为不可控制,将状态改为正在爆炸(_Boom=true),然后给我们的场景控制器Controller启动两个函数,一个是用于给积分器加一分,另一个是让整个控制器等待一段时间让消除动画不会和其他操作冲突。然后在end函数中我们把方块的各个图形变化还原成初始状态。然后让_end=true,启动销毁倒计时,并把Bricks的Update函数完善成这样:
可以看到,当end函数被触发时,当进入了_end时,我们让方块在很短的时间内缩小到0.4,让砖块可以明显地被看出被消除了。至此,我们的Bricks脚本就完成了。
接着是完善Scene脚本。Scene脚本的最后阶段一环扣一环,首先是我们如何判断砖块是否应该消除。
在每个回合(每次操作后),我们便要触发一次这个Boom函数,实际上这还是一个递归函数,用来作为判断是否爆炸的总控制,它会在for循环里遍历整个棋盘的每个元素,触发ifBoom函数判断每个砖块,每次ifBoom函数成功执行时hasBoom作为跳出递归的标记变化,只有等到整个棋盘没有任何砖块可消除时才会跳出递归。在每次遍历棋盘结束后,我们都要调用新的函数roll来让上面滚落新的砖块填补消除后的空隙,而maxIndex和minIndex是为了做上面说到的棋盘滚动时的操作延时/锁定用的。
然后是roll函数:
roll函数也是一个入口的作用。先锁定整个棋盘的操作来减少由于用户操作出现Bug的可能,然后从下向上循环触发rolling函数,在结束rolling函数后解锁棋盘。
而rolling函数呢
当rolling函数的参数位置没有砖块(被消除)时,我们触发一段循环。从那个空方块开始,竖直向上检测各个方块,当检测到上面没有方块时,继续向上检测,当上面有方块时,我们让上面那个方块滚动到最下面没方块的那个位置,若我们抵达棋盘的最上方仍没有方块时,在最上面我们利用一开始生成棋盘类似的方法,生成新的方块在看不到的地方然后让它滚落。接着在外层由于是从下向上调用这个函数,我们自然能达到方块滚落填充并产生新方块补充进新地方的状态。
然后是刚才的wait函数,这只是个简单的小函数,用于记录下滚落位置最高的砖块的位置和最低的砖块的位置,这样做不完美但是简单。
接着是如何判断是否需要爆炸方块ifBoom。
我们在ifBoom中,我们判断输入进来的目标砖块周围的砖块的颜色(id),首先我们只需要判断目标砖块的右边两个砖块和下面两个方块,因为我们的判断在外层函数中实际上是遍历了整个棋盘,所以我们从0判断到7就可以完成整个棋盘,这样写不会造成过多多余的计算。然后每当我们判断出有一个符合条件的砖块时(会爆炸),我们让标记变量flag改变并在结尾返回且我们让判断好的这几个砖块都转入Boom状态,这样不会重复计分也不会导致过多的多余计算,且通过这种办法可以让任意数的砖块都能正确引爆并计分。
然后我们再来完善一下我们的Start函数便完成了爆炸和滚动部分了,离结束只剩一点点了。
上面有说到计分函数,在封面我们也可以看到其实是有计分表的,那这个部分要怎么做呢?还有封面上能看到有计时器,棋盘旁边还有一个奇怪的像是按钮的东西,这些是什么呢?我们下次再说(先摸了)