羊了个羊P2 基本功能完善和结束判定
羊了个羊Scratch开发——第二
本集教程实现的功能
- 三个相同卡片实现消除
- 自动前进
- 全部消除后提示挑战成功
功能一 实现消除功能
在我们移动完卡片之后,我们需要进行检测是否需要消除的功能。因为代码比较长,所以我们使用自制积木(函数),在创建时选择“运行时不刷新屏幕”。
检查是否需要消除的思路就是判断相邻的三个卡片类型是否相同,如果相同即可消除。
在自制积木下方设置循环,建立一个迭代器变量i,它存放的是当前检查的方块在已选择卡片中的位置。重复检查从第一个到倒数第三个方块,如果当前方块和后两个方块类型相同,就判断这三个方块需要消除。

判断需要消除后,我们用类似上一集中要求方块自动移动的方法,广播“自动前进”消息要求被消除方块后方的方块自动前进。广播后就可以停止脚本了。如果不满足这个条件,那么则让迭代器i增加1向后进行迭代。

接下来编写自动前进广播。由于广播的接收方是所有的卡片,所以针对不同的卡片,应该有不同的动作:
- 对于需要消除的卡片,需要消除它们。
- 对于不需要消除的卡片,则根据它们的位置进行处理:
2.1 如果卡片的位置在被消除卡片位置之前,则不需要任何操作;
2.2 如果卡片的位置在被消除卡片之后,那么它需要向前移动以补上消除后空出来的位置。
如何判断需要消除的卡片?当广播发出时,已选择卡片中迭代器i的位置及之后两个卡片(i+1,i+2),就是需要被消除的卡片。用存储卡片位置的私有变量已选择卡片位置与需要消除的卡片位置比较
卡片判定消除后,用一个小动画实现消除特效。这里在卡片角色中新建一个星星造型(或者是其他的当动画的造型),在消除指令触发后将卡片造型更改为星星,停留较短的一段时间,实现消除动画效果。


为什么删除卡片时只删除一次第i项,而不删除i+1,i+2项?
因为广播作用于所有卡片,每个要消除的卡片都会通过判断语句执行这段代码。如果在这里删除三次,那么总删除次数就会变成3*3=9次,显然不符合我们的删除逻辑。
我们测试删除时可以发现,当删除队列中的某一个卡片时,他后方的卡片会接替原来的位置和编号,就像下面这个图这样。

功能二 自动前进
完成代码后测试,卡片成功消除了,但是在消除之后后面的卡片没有前进补上消除后留下的空位。这里做一个判断,选择位置在消除方块之后的方块,类似上一集中自动后退的代码,要求它们前进三格补充消除后的位置,相应地代表它们位置的变量也要作改变。

功能三 提示挑战成功或挑战失败
当所有卡片均被消除的时候,本局游戏就胜利了;当所有卡牌未被完全消除,且选择框中的卡片数量已满(达到七个),本局游戏就失败了。在检查消除情况的自制积木中,再添加两个判断,来检测游戏是否胜利或者失败。

对于挑战成功的判定,我们在上一集中声明了一个全局变量卡片数量,在游戏初始化完成后卡片数量的值为场上的卡牌数量。当每次消除时使卡片数量-3,当卡片数量归零时即为挑战成功。
对于挑战失败的判定,在每次未进行消除的消除判定后检测队列已选择卡片,若队列的长度达到7,则选择框已满,即为挑战失败。
新建一个角色作为挑战结果的遮罩。用一个半透明的黑色矩形覆盖整个屏幕,在正中间打字提示挑战结果。注意文字和图形的遮罩关系,图形应该在下。
游戏开始时初始化隐藏角色,当收到挑战成功或失败的广播后,选择对应的外观后显示它。


由于原游戏中不存在挑战失败的情况,在这里我添加了一种三个卡片进行测试。
总结
在本集过程中,我们将上一集的基本功能进行拓展,增加了方块的消除,自动前进和游戏结果提示功能,完成了游戏的基本框架。有了上一集的经验,这一集没有遇到太大的阻碍。也学习了一些实用的技巧:
- 用短时间切换造型的方法实现动画效果
- 广播时所有对象同时执行程序,根据不同对象的情况分别处理
- 用半透明遮罩实现暗屏效果

浙公网安备 33010602011771号