消消乐P3 交换卡片
消消乐 第三集
本集我们完成了交换卡片的功能。
修复bug
我们先来解决一下上次留下的bug,我们发现横向的卡片没有正常的消除,原因是视频中上次横向消除部分判断最右边两列的代码写错了,余数为7和余数为0是不可能同时成立的,应该是余数为7不成立 与 余数为0不成立,或者像我一样余数为7或余数为0 不成立。

在我们进行卡片自动补全之后,有的卡片还是没有进行消除,这是因为我们在补充之后没有执行消除操作了,我们重复执行几次消除操作就可以完成消除。因为操作执行比较慢,我们可以把自制积木设置为执行时不刷新画面。同时为了防止积木的操作没有进行完,所以我们稍微等待一段时间。

关于这部分,我使用了一种新的方法。新建一个全局变量是否进行消除操作,这个变量只在检查消除情况积木中赋值。在开始执行检查消除情况时设定为no,在进行了任意一次消除操作后设定为yes。如果有消除操作,那就需要进行补充物品,然后重复执行再次检测消除状况,直到检测消除状况全程没有进行消除操作,则这个变量会变成no,循环结束。


测试后我们发现,有的卡片消除后没有移动到指定的位置。原因是我们不能直接用物品编号来寻找位置编号和物品编号的值,而是应该用位置编号列表中物品编号的值的编号来确定。在这里我们发现卡片的移动出现了问题,原来位置编号列表的位置的值先修改成X,但是这样会导致物品类型列表中无法通过位置编号中的值确定位置。所以我要把这两行的修改倒过来,让物品类型列表先修改,位置编号列表后修改。

交换卡片
接下来我们实现拖动卡片交换的功能。如何实现拖动效果?在侦测这一栏有一个设置拖动模式的积木,我们可以把这个模式设置为可拖动。需要注意的是,在小窗状态下无论设置成什么样子这个卡片都是可以拖动的,而放大状态则设置为不可拖动的角色无法被拖动。

首先当卡片碰到鼠标的时候,我们让它有一些反应。这里提高一下亮度,如果碰到了鼠标设为10,如果点击了设为20,没有碰到鼠标就返回0。

并且我们也需要记录一下鼠标的位置。我们新建两个全局变量记录鼠标在点击时的坐标。

接下来我们来判断鼠标是朝哪个方向拖动的。当我们松开鼠标时,我们来计算鼠标的垂直位置和水平位置的绝对值,垂直绝对值更大说明是上下移动,水平绝对值更大说明是左右移动。

这时我们发现,测试时没有点击到的卡片也出现了高亮。而且我们并不知道具体的上下左右方向。对于第一个问题,我们用变量被点击来存储有没有卡片被点击,开始的时候设为0,如果有卡片被点击那么其他卡片不再做出反应。在松开鼠标后需要把变量修改回去。

接下来进一步判断上下左右。我们只需要判断鼠标坐标和卡片坐标的相对位置,就可以判断出来了。

接下来,我们完成交换卡片的逻辑。我们新建一个自建积木来实现,积木需要两个变量来导入卡片编号。

卡片需要交换的内容有位置和类型,我们设立两个临时变量来辅助交换,具体的逻辑为:
- 卡片1的内容存在临时变量里
- 卡片2的内容存在卡片1里
- 临时变量的内容存在卡片2里
执行完成后,卡片2的内容存放的就是原卡片1的内容,卡片1的内容存放的就是原卡片2的内容了。

最后,我们在确定上下左右后,找到要交换的坐标就可以了。

总结
本集我们修复了之前留下的一些bug,还完成了交换卡片的功能。其中用到的用临时变量作交换的手段是相当常见和使用的交换方式,需要理解一下,之后会经常用到这种方法。
我们在第四集中会集中修复消除方面混乱的问题,如果在这集结束后发现消除方面的奇怪操作,请先看完第四集教程再尝试。
改了一下午代码后才知道后面一整集基本都在debug的教训

浙公网安备 33010602011771号