欢迎光临
我们一直在努力

Scratch第三十八讲:英雄难过棍子关

最近一直再想做一个小游戏,但是做好了不知道叫什么名字,在网上查了才知道叫“英雄难过棍子关”,不知道对不对,先这么叫着吧。大家反正一看就知道了。

这个游戏,CC哥当时在手机上玩的不亦乐乎,最近在想做什么题材时,就一直想做一个玩玩。以前我就说过,Scratch就是一个最好的思维训练工具,不仅仅是编程思维,更是想象力,创造性,严谨,细心,专注的一种锻炼。所以CC哥的教学不像其他教学,就是带着大家一起去尝试,去思考,就算程序最后不漂亮,不够严谨,或者编的不够好,都不重要,重要的是,我们在享受这个学习的过程,不仅仅是学生们,CC哥跟着大家一起在学习,一起享受学习的快乐。

设计思路

1:会变长的棍子

做这个程序,CC哥第一个在想,这个棍子怎么能变长呀,关键是变长了之后倒下来的时候怎么能够自然。在这个部分有两种做法,一个就是改变角色的大小,这个相对简单。倒下来的时候只要用旋转就行了。但是这里面有个问题,就是棍子在变长的时候会同时变粗。还有一种做法,CC哥也不知道对不对,就是用画图来画一个棍子,但是画的棍子在倒下来的时候只能用反复擦掉重新画,这样虽然能实现倒下来,但是CC哥试了以后,发现效果不自然,刷屏闪烁的厉害。同时后面做其他处理的时候也会复杂很多。所以这里CC哥还是用了第一种做法。如果小朋友们尝试到了更好的做法,一定告诉CC哥,我会单独帮你发个帖子。

2:每一步出现下一个柱子。

这个比较简单,只要用克隆就好了。每走一步克隆一个。但是在这里,CC哥遇到了一个坑,研究了半天,才发现了之前忽略掉的一个小知识,就是消息和克隆体的关系,一会给大家详细介绍。

3:棍子不够长掉下来,或者棍子太长超过了下一个柱子。

这个就是要解决位置的关系,要确认棍子的长度,棍子头的位置要保证在下一个桥墩上,不能短,也不能超过。

开始编程

程序设计的几个关键点想明白了,就开始动手吧,在编程的过程中在看会遇到什么问题。

先弄了几个角色,为什么有两根柱子,一会CC哥在讲。先看棍子这个角色。

注意到没有,棍子其实就是一根线,注意关键点是这个线的起点在圆心的位置,为什么这样呢?大家想一下,棍子一会从直立倒下来的时候是不是围绕着棍子的一头在旋转?所以我们一定要把棍子的一头放在中心点上。

柱子和小猫这个角色CC哥就不再介绍了,本来想做个火柴人呢,CC哥一直想做个火柴人的小游戏,不过还没想好到底做成什么样子,等下次好好研究一下再说。

我们再重新捋一下程序的流程:

第一步:小猫和棍子都在第一个柱子上。同时出现了下一个柱子。

小猫这部分的程序是:

棍子这部分的程序是:

这部分核心是棍子到初始位置,然后棍子朝上,这个好理解。那这些变量的都是为了后面程序定义的初始化。‘棍子长度‘好理解,长度30。我们需要这个变量是因为我们一会需要知道棍子的长短,确保能算出棍子是否能够搭到下一个柱子上。

“新柱子”这个变量和“开始新搭桥”这两个变量,都是一种描述状态的变量,也就是后面编程的时候会用这两个变量的数值,来判断程序中的一种状态。可以是角色的状态,也可以是一个过程的状态。这部分一会在程序里专门讲这两个变量的用途。

柱子这部分的程序是:

这部分程序是个主要程序,其中最关键的就是柱子先克隆自己然后走到下一个随机的位置。那么什么时候克隆自己呢?也就是小猫走到每走到下一个柱子的时候克隆自己。在这里第一个坑就出现了。

CC哥一开始的时候想的很简单,什么时候克隆,当然是小猫走到下一个柱子的时候,发布一条消息,柱子收到消息的时候克隆自己就行了。结果不论怎么做,程序都怪怪的,总是克隆出不止一个柱子。研究了半天CC哥才意识到一个关键问题!当用消息来同步的时候,那不止柱子的本体收到了消息,所有的克隆体也会收到同样的消息,做同样的操作!而CC哥只想每次克隆柱子的本体就好。发现了这个坑,下面就简单了,CC哥没有在用消息来进行过程控制,而用了一个新柱子的变量来控制过程,当新柱子这个变量等于1的时候就执行克隆操作。如果等于0的时候就不执行。大家知道新柱子这个变量的用途了吧?是不是又get了一个小技巧?用状态变量来做进程的管理?

程序的逻辑就是,当需要在新位置出现新的柱子是,先在原来的位置上克隆自己,然后本体移到下一个随机的距离。(新位置这个变量是记录下来新柱子和之前柱子之间的距离)如果发现新的位置已经超过边界了,那么就让屏幕上所有的东西都往左移动(发布全体后退消息)。也就是之前说过的滚屏了。(注意在一个新柱子生成结束之后,要把状态变量复位。也就是把新柱子这个变量归零。)滚屏操作一定要算好位置,这个一会在程序里面再看细节。

第二步:就是开始用棍子搭桥了。

有点长,为了方便大家看清楚,CC哥截成了两张图。

思路就是按下空格键的时候,棍子就变长,然后松开,棍子就倒下来。

在棍子变长这里面有一个小坑。本来CC哥就是简单的判断是否按下了空格键,用了一个侦测命令。在执行的时候,发现,如果在棍子倒下来的过程中,又按了空格键,那这部分程序又被启动了。 所以CC哥在这里又加了一个状态变量。《开始搭新桥》,一旦开启这个过程,就把这个变量变成1,那么在启动过程的时候,我们不仅判断是否按下了空格,同时判断这个变量的值,如果不等于0,说明一个过程还没结束,所以不能启动这个过程。大家明白了没?

棍子长度我们要计算,因为要判断是否能够搭到下一个柱子上。长度的算法就是看这个棍子放大了多少倍,然后乘以原始的长度。

倒下来的过程,就是右转90度。

下面一个关键点是确定棍子有没有碰到下一个柱子,又有一个技巧点了,这个CC哥是不是处理的最好也不知道,可能大家有更好的处理方法啦。CC哥一开始想的就是看棍子有没有碰到下一个柱子的时候有一个问题,因为棍子本身就在一个柱子的克隆体上,所以用检测命令没法检测,因为这个命令是把克隆体和本体当成一样来处理的。所以没法直接用这个侦测命令。

那怎么办,CC哥直接用了之前常用的办法,又复制了一个角色,然后把它变成透明,这样就可以用侦测命令了。等编完游戏的时候,我发现可以直接用棍子的长度来计算是否能到达下一个柱子了。,不过这里CC哥就不改了。就当重新温习一下技巧了。

如果棍子正好放到下一个柱子上,那么就通知小猫可以移动了。同时记得把棍子的长度变量复原。如果棍子长度超过了下一个柱子的边缘,就直接结束游戏了。

上面这块程序是如果棍子不够长,那么就做了一段棍子掉落的效果,这部分比较简单,大家自己看吧。在整个过程执行完之后,要记得把开始新搭桥的变量复位,这样空格键就又可以使用了。

第三步:小猫移动到新的柱子上,开始下一个循环。

小猫的程序:

移动到下一个柱子上,同时将新柱子的变量设为1。这个变量的改变会导致立即产生一个新的柱子。参考上面柱子的程序。

棍子的程序:复位准备下一轮。

全体后退的执行:

这个单独说一下,其实就是横向滚动屏幕操作。要算好位置。很简单,就是新的位置往左走480步。

小猫的后退:

棍子的后退:

柱子的后退:

柱子的后退包括两部分,除了往后移动外,还要碰到边缘的时候删除克隆体。(在这里大家就发现一旦接到后退的消息,所有的克隆体都会同时移动的)

关于虚拟柱子的程序,其实就是为了侦测方便,就不再讲了。

这次的培训,CC哥把自己在编程过程中的误区和坑也都分享给了大家,大家如果有什么好的作品,也可以分享给CC哥,如果有意思的话,我会把大家的作品作为讲座分享出来。邮件地址:

如果觉得CC哥做的不错,请点击右下角的"好看",给CC哥一个鼓励!

超乎想象的使用体验

历史课程:

赞(78)
分享到: 更多

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址