科创科普:Scratch 角色的「位置感」——坐标、事件与克隆三件套

科创科普:Scratch 角色的「位置感」——坐标、事件与克隆三件套

一、舞台是一个坐标平面 打开 Scratch,右边那块白色区域叫舞台。它并不只是一个画面,而是一个标准的平面直角坐标系:舞台中心是原点 (0,0),向右 x 增大,向上 y 增大。整个舞台宽 480、高 360,所以 x 的取值范围是 -240 到 240,y 的取值范围是 -180 到 180。 这组数字要记牢,因为它解释了很多同学的第一类困惑:为什么「移动 200 步」之后角色会贴着右边停住?因为角色中心一旦超过 x=240,就已经跑到舞台外面去了,屏幕上自然只剩一半。 判断一个角色现在在哪,最稳的办法不是靠眼睛看,而是在脚本里临时加一个「说 (x 坐标) 和 (y 坐标)」,或者勾选角色信息面板,让它把坐标实时显示出来。

二、方向:数字 90 不是「向右转了 90 度」 Scratch 的方向值描述的是「角色面朝哪里」,而不是「转了多少」。对照表只有四个关键值: · 0 —— 朝上 · 90 —— 朝右 · 180 或 -180 —— 朝下 · -90 —— 朝左 所以「面向 90 方向」等于「面朝右」,而不是「向右转」。这两句话只差一个字,程序的行为却完全不同。 常用的移动积木有三个: · 移动 (10) 步:沿当前面向方向前进,方向是斜的,它就走斜线。 · 移到 x: (-200) y: (0):瞬移,用于开局摆位。 · 在 (1) 秒内滑行到 x: (200) y: (0):平滑移动,适合做动画,注意它是「滑行」不是「匀速转向」,滑行过程中角色朝向不变。 如果想让角色始终面朝自己前进的方向,就要再补一块「面向 (90) 方向」,或者改用「移步并转向」类积木。

三、事件:程序到底从哪里开始跑 脚本不是从上往下自动执行的,它必须被「触发」。Scratch 里最常见的触发叫事件积木: · 当绿旗被点击 —— 整个作品的总开关,通常放在主角色上。 · 当按下 (空格) 键 —— 做键盘控制游戏用。 · 当角色被点击 —— 做按钮、抽奖、翻牌用。 · 当接收到 (广播名) —— 角色之间互相通知,比如「游戏结束」。 · 当作为克隆体启动时 —— 克隆体专属的入口,第四部分细讲。 这里有一个新手常用的错误:把「当绿旗被点击」放在了每个角色上,每个角色各写一套重复逻辑,改一个数字要改五遍。正确做法是让主角色发广播,其他角色用「当接收到」响应,把控制权集中在一处。 还要分清「广播」和「广播并等待」:前者发完立刻往下走,不等别人;后者会等所有接收方把响应脚本执行完,再继续。做「先播完开场动画,再开始计时」这类有先后顺序的效果时,必须用「广播并等待」。

四、克隆:让一个角色变成一群 Scratch 有「克隆自己」积木,一个角色可以复制出很多个自己,每个复制品叫克隆体。三条关键事实: 1. 克隆体会完整继承创建那一刻的位置、方向、造型、大小和变量值。所以「先移到目标点,再克隆自己」是标准写法,克隆体一出生就在正确的位置。 2. 克隆体只在「当作为克隆体启动时」下面响应,写在「当绿旗被点击」下面的移动代码,克隆体不会执行。这是第二类高频困惑:明明克隆出来了,却一个个呆在原地不动。 3. 克隆体有上限,Scratch 3 里同一个角色的克隆体最多 300 个。更麻烦的是,克隆体不会自己消失,必须显式执行「删除此克隆体」,否则数量只增不减,舞台越跑越卡,最后新克隆体再也生不出来。 经验规则:谁创建,谁负责删除。定时生成的星星要在一个固定寿命后删掉,被碰到的子弹要在碰撞那一刻删掉。

五、案例:一朵会自己散开的烟花 需求:按下空格键,在舞台中央生成 30 个火花,每个火花朝不同方向飞出去,1 秒后消失。 实现思路(文字描述积木顺序): 第 1 步,建立变量「编号」,在「当绿旗被点击」时设为 0。 第 2 步,当按下空格键 → 重复执行 30 次:把「编号」增加 1 → 面向 (编号 × 12) 方向(30 个火花正好铺满 360 度)→ 移到 x:0 y:0 → 克隆自己。 第 3 步,当作为克隆体启动时 → 重复执行 20 次:移动 5 步,同时把「虚像效果」增加 5(越飞越淡)→ 循环结束后删除此克隆体。 这里能一次用上今天的三件套:坐标负责起点,方向负责散开的角度,事件负责「按下才触发」,克隆负责「一个变三十个」。如果第 3 步忘了删除,跑几次就会看到火花越积越多、动作越来越卡,正好用来验证第四部分的结论。

六、三个高频 bug 自查表 · 角色跑到一半不见了:先看坐标是不是超出了 ±240 / ±180,再检查「显示」积木有没有被隐藏覆盖。 · 克隆体不动:检查移动代码写在了「当绿旗被点击」还是「当作为克隆体启动时」下面。 · 作品越玩越卡:数一数克隆体有没有配对的「删除此克隆体」,尤其是「重复执行」里面创建的。 · 方向乱转:确认用的是「面向 90 方向」(绝对朝向),而不是「右转 90 度」(相对旋转),两者在一个循环里会叠加出完全不同的结果。

七、练习 1. 让角色从舞台最左边 (x = -240) 匀速走到最右边 (x = 240),用时 3 秒,写出积木顺序。 2. 说出「面向 0 方向」和「面向 180 方向」分别是朝哪边;「面向 -90 方向」呢? 3. 一个角色克隆了 50 个,每个克隆体都执行「重复执行 10 次 移动 5 步」,共移动多少步?如果它们都从 (0,0) 出发、方向都是 90,最后会不会重叠? 4. 想实现「点击开始按钮后,三个角色同时开始跳舞」,应该用「广播」还是「广播并等待」?为什么? 5. 找出下面的问题:玩家角色的脚本写着「当绿旗被点击 → 重复执行(克隆自己)」,运行十秒后程序卡死。 6. 设计一个「打地鼠」:地鼠随机出现在 9 个格子里,被点击后消失并在 0.5 秒后出现在新格子。说说你会用哪几种积木,坐标怎么算。

参考答案思路 1. 用「在 3 秒内滑行到 x:240 y:(当前 y 坐标)」,比在循环里移动更平滑;若要用循环,就重复 60 次、每次移动 8 步。 2. 0 朝上,180 朝下,-90 朝左。注意 180 与 -180 是同一个朝下方向。 3. 每个克隆体移动 50 步;方向相同、起点相同,所以最后会完全重叠成一个,看起来像只有一个角色——这正是需要给每个克隆体不同方向或不同起始坐标的原因。 4. 用「广播」。三个角色是同时开始,不需要等谁先结束;如果用「广播并等待」,主脚本会卡在第一个角色上,后面的角色反而晚开始。 5. 创建克隆体的代码放在了「重复执行」里又没有删除,克隆体迅速冲到 300 上限,之后每帧都在无效尝试,程序卡死。修法:只在需要时克隆,并给克隆体加上「等待 1 秒 → 删除此克隆体」。 6. 用「移到 x:(-160)+((随机数 0 到 2)×160) y:(-120)+((随机数 0 到 2)×120)」定位九个格子中心;用「当角色被点击」处理命中;消失用「隐藏」,再「等待 0.5 秒 → 重新随机定位 → 显示」。若用克隆体方案,则每个克隆体自己管理隐藏与重生。