制作您自己的 Scratch 积木可以让您反复使用您的一些代码。让我们制作一个可以工作的模拟时钟。这将需要绘制三只手,因此我们想要制作一个绘制一只手的块。这将是我将详细讨论的最先进的程序。
转到变量并创建一个名为radius的新变量来存储时钟的总半径。
转到我的块并单击创建块。调用块Hand。然后创建一个数字输入四次,并将输入命名为angle、length、depth和block。这些将让您指定指针所在的角度(0 表示 12 点钟)、相对于半径的长度乘数(例如,我在 0.6*radius 处设置时针)、这个层所在的层有多深手是相对于脸绘制的(我们将在不同的层绘制三只手,这样它们就不会相互碰撞),以及手的方块(我们将其设置为空气以擦除手用于动画)。
现在您需要通过说明其中发生的操作来定义Hand块。
从Control中拉出一个“if ... then ...”块并将其扣在 Hand 块标题下。
填写检查角度是否不为空的条件:如图所示从Operators中拉入“not”和“=”块(您需要删除“=”块中的“50”,并且不放任何在其位置的东西——甚至没有空间)。
手块将从钟面中间的海龟开始,面朝上,笔朝上(即不画图)。
拉入Minecraft “turtle save”方块以保存开始的海龟位置,然后将其捕捉到“if ... then ...”方块内。
然后将海龟倾斜 -90 度,使其面向水平,将其向前移动深度以将其移动到手所在的层(将深度变量从Hand标题拖动到“turtle forward”块中),倾斜海龟后退 90 度,然后将海龟向右旋转角度变量(将其从“手”标题中拖出)。放下乌龟笔,将乌龟块设置为块变量,然后按长度*半径前进(从Operators中拉出一个乘法块)。然后使用“turtle restore”块将 turtle 恢复到Hand块开始运行时的状态。
现在,对于面部轮廓,我们需要一个Circle块:再次使用My Blocks创建它,并给它一个输入r。该块将在与Hand块相同的海龟条件下调用。
对于圆形,我们保存海龟,将海龟块设置为黑色羊毛,将海龟向前移动 r ,将海龟向右转 90 度,然后绘制一个 72 边形的多边形。该多边形的每一边都是r* 0.087(圆的周长是 2πr,2π/72 大约是0.087)。然而,为了使多边形居中,我们首先后退该数量的一半。多边形重复72次完成,然后我们将海龟恢复到原来的状态。这段代码可能值得在其他项目中重复使用。
现在,我们编写主要代码。再创建六个变量:h、m、s、h0、m0、s0。h 、m、s变量将存储时针、分针和秒针的当前角度。h0 、m0、s0变量将存储以前的角度,因此我们可以比较它们并只重绘那些在任何给定时间需要重绘的手。
从通常的“当绿旗选中时”和“连接到 Minecraft”块开始。然后从Variables中拉出“set”块,并使用它们将h0、m0和s0变量设置为空(只需删除默认情况下在块的值槽中的“0”,什么都不放- - 甚至没有空间 - 在他们的位置)。将半径变量设置为您喜欢的任何值:我选择了 18。
现在,将海龟向上倾斜 90 度,使其指向上方,将笔向上抬起,然后向前移动radius。您现在在钟面中间有了乌龟,笔朝上,指向上方,就像手和圆块需要的那样。调用Circle块(从My Blocks中拉出),将radius放入其输入中。
现在从控件中拉出一个Forever块。其余代码都在其中。
将h设置为“当前小时”(在Sensing中,默认情况下为“当前年份”,但您可以使用下拉列表将“年份”更改为“小时”)乘以 30(每次旋转 12 小时,360/12=30 度)。
将m设置为“当前分钟”乘以 6(每转 60 分钟,360/60=6 度)。
将s设置为“当前秒数”乘以 6。
现在,您将拥有三个“如果……那么……”积木,每只手一个。第一个检查以确保h不等于h0,即时针自上次移动以来已经移动(请记住h0开始时为空白,因此它第一次运行时将算作已移动)。然后用角度h0调用Hand块,无论你喜欢什么长度乘数,深度为 0,并且块是空气(从Minecraft中拉出“block id”块并选择“air”)以擦除旧手(如果有是一个)。接下来用角度h和你真正想要它的任何块来调用它。
然后将h0设置为h,这样您就可以监控手的运动。
对分针和秒针执行相同的操作,但深度为 1 和 2,这样它们就不会相互干扰。
为了获得更好的性能,在“永远”块的开头放置一个“暂停绘图”块,在它的末尾放置一个“恢复绘图”块。这使得所有的方块同时被绘制,以获得更流畅的动画和更高的效率(例如,有时一个手方块被擦除只是为了再次绘制,因为它仍然是手的一部分在新的位置;暂停/恢复方法意味着不需要擦除)..
就是这样!在代码截图中,我将主要代码拆分为两张图片以适应。