1. 把 Scratch 运动模块放在第一课,是我吃过亏之后的选择
刚带青少年编程班那会儿,我犯过一个典型的新手教练错误:第一节课上来就讲"外观"模块,让角色换造型、说话、变色,课堂气氛确实热闹,孩子们笑得前仰后合。结果第二节课切到 Scratch 运动模块,全场懵了——角色为什么往左上跑?为什么点一下"移动 10 步"它就不动了?为什么方向设成 90 度,角色还是歪的?一节课下去,一半人还在跟坐标较劲。后来我把顺序调过来,第一课就啃 Scratch 运动模块,先让角色"动得对",再让它"动得好看",整个教学节奏才顺过来。这件事让我彻底明白一个道理:运动模块是 Scratch 的地基,地基没打牢,后面所有花活都是空中楼阁。
Scratch 的运动模块说白了就九块积木,看着简单到不值一提,但它承载了三件对小龄学习者极其关键的事:一是建立屏幕坐标系的空间感,二是理解"方向"这个抽象量怎么被数值表示,三是第一次接触"程序按顺序执行"和"循环重复"的执行模型。这三件事后面会贯穿变量、克隆、侦测、甚至初学 Python 时的turtle绘图。所以这篇内容我想按我实际带课的思路,把运动模块从坐标原理、积木行为、参数计算、案例实操到踩坑排查,完整拆一遍,适合刚接触 Scratch 的青少年自学,也适合带班的老师直接拿去改课件。
1.1 为什么坐标感比积木用法更难教
很多人以为运动模块的难点是记积木,其实不是。九块积木,十分钟就能认全。真正的难点在于孩子脑子里没有那张"带刻度的纸"。成年人用鼠标拖角色,拖到左边就知道"x 变小了",这是多年使用图形界面养出来的直觉;十来岁的孩子没有这个迁移能力,他看到的只是"图片跑到左边去了"。
所以我在教学里会把概念顺序倒过来:先画坐标轴,再认识角色位置,最后才碰积木。我会在白板上画一个 480×360 的长方形,把中心标成 (0,0),然后让孩子上来把一张便利贴贴到 (120, 60) 的位置,贴错了大家一起找原因。这一步花十五分钟,但后面省下至少两节课的返工。原理很简单,Scratch 舞台的坐标系是一张固定刻度的纸,角色的"位置"就是它中心点在这张纸上的坐标,只有先承认这张纸存在,积木才有意义。
1.2 运动模块和其他模块的耦合关系
有个容易被忽略的事实:运动模块几乎从不单独工作。你写"重复执行 移动 10 步",它必须配控制模块的循环;你写"如果碰到边缘就反弹",它要依赖侦测模块的碰撞判断;你写键盘控制,得靠事件模块的按键触发。这意味着运动模块其实是整个 Scratch 积木体系的"出口"——所有逻辑最终都要落到"角色动一下"或者"角色变一下"上。
我在课上会刻意强调这个耦合关系。比如讲"碰到边缘就反弹"时,我会顺手把侦测模块里的"碰到边缘?"拖出来对比,让孩子看到一个是条件判断、一个是带动作的判断。这样等到后面讲"如果……那么……"时,孩子已经见过真实用例,接受起来毫无障碍。这种提前埋伏笔的做法,比按模块目录顺序一块块讲要高效得多。
1.3 一节课的时间怎么切
我的常规切法是:坐标讲解 15 分钟,积木认识 10 分钟,案例实操 20 分钟,问题排查与分享 10 分钟,留 5 分钟收尾。这个比例不是拍脑袋定的,是因为运动模块的知识密度低但手熟要求高,讲太多孩子记不住,必须靠动手把它变成肌肉记忆。
实操环节我坚持一个原则:每个孩子必须自己独立把角色从 (0,0) 移动到 (100,100),不许抄旁边人。这个看似无聊的小任务,能一次性暴露坐标写反、正负号搞错、位置和方向混淆这三类问题。等他们自己能算对坐标,后面的滑行、反弹才有讨论的基础。
2. 480×360 的舞台,先把它当一张带刻度的纸
2.1 坐标系的三层含义,别混着讲
Scratch 舞台的分辨率是 480×360,中心点是 (0,0)。这句话我说过无数遍,但真正理解它需要拆成三层:
第一层是范围。x 从 -240 到 240,y 从 -180 到 180,一共 481×361 个整数位置(严格说是连续坐标,但孩子按整数理解就够了)。角色一旦超出这个范围,就会被"裁剪"——注意,不是消失,是只显示舞台内的那部分。我见过孩子把角色移到 (500, 0) 然后大喊"角色没了",其实就是跑到界外去了,点一下"回到原点"就回来了。
第二层是正负方向。x 往右为正、往左为负,这个大家都能接受;y 是往上为正、往下为负,这跟很多孩子第一次学的数学坐标系一致,但跟屏幕像素坐标(从上往下递增)相反。我通常会直接告诉他们:"Scratch 跟数学课本一样,y 往上变大。"一句话就够,不用绕。
第三层是单位。Scratch 里 1 步约等于 1 个像素(在默认舞台大小下),所以"移动 10 步"基本就是屏幕上挪一小截。这个换算关系讲清楚,后面算速度、算滑行时间才有依据。
| 概念 | 数值 | 常见误解 |
|---|---|---|
| 舞台宽度 | 480 像素 | 以为 x 范围是 0~480 |
| 舞台高度 | 360 像素 | 以为 y 往下为正 |
| 中心点 | (0, 0) | 以为在左上角 |
| x 范围 | -240 ~ 240 | 忽略负半轴 |
| y 范围 | -180 ~ 180 | 混淆屏幕像素坐标 |
提示:判断孩子是否真的理解坐标,最简单的检验方法是问"角色在 (-200, 0) 的什么位置",答"左边靠边"就对了,答"左上"说明还是背的。
2.2 方向值到底代表什么,为什么 0 是朝上
Scratch 的方向值是 -179 到 180,其中 0 表示朝上,90 朝右,180(或 -180)朝下,-90 朝左。这套定义的由来是把"正上方"当作 0 度,顺时针为正。孩子第一次看到会觉得别扭,因为他们习惯把向右当 0 度。
我在课上会用一个很土但有效的办法:让孩子伸出右臂,说"手举过头顶是 0,手伸向右边是 90,手垂下来是 180,手伸向左边是 -90",然后让他们跟着我慢慢转一圈,边走边喊数字。身体动一遍,比看十遍图管用。
这里必须提前埋一个关键区分:方向值决定的是"角色往哪走",不是"角色长什么样"。这两件事在运动模块里是分开的,后面讲旋转方式时会再展开,但一开始就要说,否则孩子一定会问"我方向设成 90 了,为什么小猫还是竖着的"。
2.3 三种旋转方式:改的是外观,不是走向
Scratch 有"任意旋转""左右翻转""不旋转"三种旋转方式。这块积木是运动模块里最容易误解的一块,没有之一。
关键在于:这三种方式只影响角色造型的显示方式,完全不影响方向的数值,也不影响"移动"积木的走向。也就是说,你把旋转方式设成"不旋转",角色方向改成 180,再执行"移动 10 步",它照样往下走,只是造型一动不动地原样往下降。
我一般用这个类比解释:方向和移动是"司机的方向盘",旋转方式是"车贴朝哪个方向印"。方向盘往哪打,车就往哪开,车贴歪了不影响行驶路线。
- 任意旋转:造型跟着方向值转,默认选项,适合飞机、箭头、子弹这类"头部朝前"的造型。
- 左右翻转:只做水平镜像,角色永远不会上下颠倒,适合小猫、小人这类"站着走路"的造型。
- 不旋转:造型保持原样,适合俯视视角的圆形、矩形、球类道具,或者不需要朝向的东西。
新手最常做的是给小猫用"任意旋转"做键盘控制,然后发现按左键时小猫倒立着走,视觉上非常怪。这时候换成"左右翻转",立刻正常。这个细节我讲课时会专门让孩子两种都试一遍,自己对比,体会比我讲十遍都强。
3. 九块运动积木逐条拆:参数、行为、坑
3.1 移动与转向:最容易被低估的两块
"移动 10 步"是运动模块的第一块积木,也是最常被当成"向前走"来理解的积木。它的真实行为是:沿角色当前方向值所指的方向,前进指定步数。方向 90 就往右 10 步,方向 0 就往上 10 步,方向 45 就往右上方走 10 步(斜向移动,x 和 y 同时变化)。
这里有个很多人没注意到的点:斜向移动 10 步,实际 x 变化大约 7.07、y 变化也大约 7.07,因为它是沿对角线走 10 的距离,不是 x 走 10、y 走 10。这个细节对精确摆位有影响,告诉年龄大一点的孩子,他们会觉得很有意思。
"右转 15 度"和"左转 15 度"改的是方向值,右转是加、左转是减,碰到边界会绕回去。转动本身不会让角色移动一步,这是我课堂提问率最高的一条。总有孩子写完"右转 90 度"发现角色没动,以为积木坏了。我会让他们把角色想象成原地转圈的人,转完还是站在原处,只是面朝另一方向。
还有一个隐藏坑:右转 90 度连续按四次,方向值会从 0 变成 360,而 Scratch 会把它折算回 0。但如果你在程序里做方向判断,比如"如果方向 = 90",那么转过四圈之后方向可能显示为 0 而不是 360,逻辑上没问题,但如果你用"方向 > 270"这类判断,就会踩空。我的建议是判断方向时尽量用区间或取模,别写死具体数值。
3.2 坐标设置类:定位的两种写法
"将 x 坐标设为 100"和"将 x 坐标增加 10"是两族积木,区别是赋值和累加。前者把位置直接钉死在某个值,后者在当前位置上叠加。新手最容易在这上面翻车的是循环里用"设为"。
举个例子:孩子想让角色一边走一边留下痕迹,写了"重复执行 10 次:将 x 坐标增加 10",角色从 0 走到 100,正确。但如果写成"将 x 坐标设为 10",那角色十次都停在 10,一动没动。这个对比实验我每次都会做,让孩子自己看结果,比讲赋值和累加的概念直观得多。
同理,"将 y 坐标设为 -180"是把角色贴到底边,注意这是"角色中心点到底边",如果角色很大,它的下半部分会被切掉,看起来像半截身子陷进地板。这个现象在给孩子做"走路"动画时特别常见,解决办法是把造型的旋转中心点上移,或者干脆把 y 设成 -150 之类留点余量。
3.3 滑行、随机位置、边缘反弹:三块"高级积木"
"在 1 秒内滑行到 x:0 y:0"是运动模块里唯一带时间参数的积木,也是第一个让孩子感受到"缓动"的东西。它的行为是从当前位置线性插值到目标位置,耗时由你指定。这里有个必须说清楚的点:滑行期间角色是被"占用"的,如果你在另一个脚本里同时让它移动,两个指令会打架,最后的结果取决于执行顺序,很难预测。
"移动到随机位置"看起来无害,实际是个坑王。它的随机范围是整个舞台,也就是说角色可能出现在任何地方,包括你精心布置的背景之外。做游戏时如果用它,一定要配合"如果碰到某某就……"做二次修正。我在课上会让孩子连按十次随机位置,观察角色到处乱窜,然后问:"这能用来做敌人出现吗?"孩子自己就会说"不行,得限制范围"。
"碰到边缘就反弹"是我最想吐槽的一块积木。它的官方行为是碰到舞台边缘就把方向翻折回来,让角色留在舞台内。但在实际使用中,由于角色造型大小不一、旋转中心可能偏、每次移动步数可能很大,表现经常不理想:斜着撞墙后角度变得很奇怪、贴着边来回抖、卡在角落里动不了。所以我的做法是低年级用它做入门演示,高年级一定要讲清楚它不保证物理正确的反弹角度,需要精确反弹就自己算。
3.4 参数计算实例:让角色走一个正方形
光讲不练没用,走正方形是运动模块最经典的计算练习。目标是让角色从 (-60, 60) 出发,沿四条边各走 120 步,回到原点附近,形成一个中心在 (0,0) 的正方形。
先算坐标:起点 (-60, 60),方向设为 90(朝右),移动 120 步后到 (60, 60)。右转 90 度,方向变成 180(朝下),移动 120 步后到 (60, -60)。再右转 90 度,方向变成 -90(朝左),移动 120 步后到 (-60, -60)。再右转 90 度,方向变 0(朝上),移动 120 步回到 (-60, 60)。闭环。
积木序列大致长这样:
当绿旗被点击 将旋转方式设为 [任意旋转] 移到 x: -60 y: 60 面向 90 方向 重复执行 4 次 移动 120 步 右转 90 度这里我要让孩子自己算一遍 120 是怎么来的:正方形边长如果是 120,半边长就是 60,所以四个角的坐标是四个 ±60 的组合。这个推导过程比记住结果重要得多。算完之后我会追问一句:"如果我想让正方形更大,边长 200,起点该设成多少?"答案是 (-100, 100),因为半边长 100。孩子能自己推出来,说明坐标概念真的立住了。
顺带算个速度:如果每帧移动 10 步、Scratch 每秒执行 30 帧,那么速度就是 300 步/秒,走 120 步只要 0.4 秒。这就是为什么很多孩子写"重复执行 10 次 移动 10 步",角色"嗖"一下就没了——不是程序错了,是太快了。想看清过程,要么减小步数(比如 2 步),要么加"等待 0.1 秒"。
4. 三个递进案例,从"能动"到"像回事"
4.1 案例一:键盘漫游,把方向和坐标焊死在手上
第一个案例我一般不给完整代码,只给目标:按上下左右键,角色能在舞台里自由走动,且不会倒着走、不会跑出边界。
实现思路有两种写法。第一种是四个"当按下 XX 键"事件脚本,每个里面写"面向 X 方向 + 移动 10 步"。第二种是一个"重复执行"里嵌四个"如果按下 XX 键"判断。我给孩子的建议是先用第一种,因为它直观;但一定要让他们试试第二种,因为第二种才是后面做多角色游戏的通用写法。
关键细节在于方向设定和旋转方式的配合。按右键时"面向 90 方向"再移动,按左键时"面向 -90 方向"再移动。如果旋转方式是"任意旋转",按左键时角色会头朝下倒着走,很怪。所以案例一开始就要把旋转方式设成"左右翻转"。
再加一步边界处理:角色走到 x 接近 240 时会一半身子出界。最简单的修法是限制范围,用"如果 x 坐标 > 220 那么 将 x 坐标设为 220"这类判断,或者干脆用"如果碰到边缘就反弹"做个粗糙版的挡墙。第一种更精确,第二种更省事,我会让两种都实现,让孩子自己比较手感。
4.2 案例二:方形巡逻,把循环和坐标判断用起来
第二个案例做个"巡逻兵":角色沿矩形路线来回走,走到拐角处转向,全程不碰壁、不出界。
这个案例的价值在于它必须用坐标判断,而不是靠"碰到边缘就反弹"。因为巡逻路线是自定义的,不是舞台边缘。写法是:用"重复执行"配合"面向方向 + 移动",再用"如果 x 坐标 > 180 那么 面向 -90 方向"这类条件切换方向。
具体参数可以这样设:巡逻范围 x 在 -180 到 180 之间,y 固定在 0,方向初始设 90。每次移动 5 步,如果 x 坐标 > 180 就面向 -90,如果 x 坐标 < -180 就面向 90。这样角色就在一条水平线上来回跑。
想升级成矩形巡逻,就加一组 y 判断:x 到边界后先转向下,y 到 -120 后再转向左。这时候孩子就能感受到,用坐标判断做巡逻,可控性远高于"碰到边缘就反弹",因为你能精确指定路线,而反弹积木只能贴着舞台边。
我在这个案例里会穿插讲一个词:"状态"。角色的方向、位置合起来就是它的状态,巡逻程序本质上就是一套"根据当前状态决定下一步"的规则。这个词对后面讲变量很有帮助,不用深讲,提一嘴就行。
4.3 案例三:开场滑行,理解时间和插值
第三个案例做开场动画:角色从舞台左下角 (-200, -120) 滑到中心 (0, 0),用 2 秒完成,然后停住。
这块积木的参数是"在 2 秒内滑行到 x:0 y:0"。孩子写完之后会觉得"太慢了"或者"太快了",我会引导他们算一遍:从 (-200,-120) 到 (0,0),水平距离 200、垂直距离 120,沿直线距离约 233 步。2 秒走完,平均速度约 116 步/秒。如果改成 0.5 秒,速度就接近 466 步/秒,视觉上就会显得很急。
这个计算的意义在于建立"时间参数和速度"的直觉。很多孩子调滑行时间全靠试,试十几次也调不好。如果教他们先算距离再估时间,两三次就能定下来。
升级版可以做"分段滑行":先从左下到右上,再从右上到中心,两段不同时长,做出有节奏感的进场。这时候要注意每段滑行之间不能有其他运动指令插入,否则会打断。我一般让孩子在每段之间加"等待 0.2 秒",节奏感立刻就出来了。
5. 课堂上翻车最多的六个地方
5.1 方向对了,造型还是歪的
这是最高频问题,本质是旋转方式没设对。孩子把方向设成 90,然后发现角色还是正着的,或者反过来,方向没设但角色横过来了。排查顺序应该是:先看旋转方式,再看造型本身在编辑器里的朝向,最后看方向值。
有个隐藏因素:造型的旋转中心点。如果造型在编辑器里旋转中心被拖到了角落,那么无论方向怎么设,角色转起来都会"绕着角落"甩,看起来像在漂移。这个坑很隐蔽,因为积木全对、逻辑全对,就是视觉不对。解决办法是打开造型编辑器,把中心点(那个十字圆圈)拖回角色身体中心。
5.2 边缘反弹为什么会卡在边上抖
现象是角色贴着边缘来回抖动,或者卡在角落出不来。原因通常是三个叠加:一是每次移动步数太大,一步就跨过了边界,反弹回去又跨回来,来回震荡;二是角色造型本身比较宽,中心点已经贴边但身体还伸在外面;三是多个脚本同时对角色发运动指令,互相打架。
排查我一般分三步。第一步把移动步数改小,比如从 20 改成 2,看抖动是否减轻,减轻了就说明是步长问题。第二步把造型缩小或换个简单造型试,排除造型尺寸因素。第三步检查是不是有两个"当绿旗被点击"的脚本同时在跑。这三步走完,九成问题能定位。
注意:如果非要用"碰到边缘就反弹"做游戏,建议给角色留出边距,比如先在舞台四周放一圈隐形挡板,让角色撞挡板而不是撞舞台边缘,可控性会好很多。
5.3 帧率、步数与"跑太快"
Scratch 的循环是每帧执行一次,默认约 30 帧/秒。这意味着"重复执行 移动 10 步"的实际速度是 300 步/秒,一秒钟能横穿整个舞台。孩子做的第一个程序往往是"角色一闪就没影了",然后以为程序出错。
我在课上会把这个速度换算写在白板上:速度 = 单次步数 × 30。想慢下来,就把单次步数降到 1~3,或者在循环里加"等待 0.05 秒"。但要注意加等待会拖慢整个脚本,如果同时干别的事就会卡顿。更好的做法是降低步数,让移动本身变慢,而不是靠等待硬拖。
还有一个容易被忽略的点:不同电脑性能不同,"重复执行"的实际帧率可能有波动。所以做需要精确计时的项目(比如计分游戏),不要依赖帧数当时间单位,改用计时器或"等待"来控制节奏。
5.4 常见问题速查表
| 现象 | 最可能原因 | 快速处理 |
|---|---|---|
| 角色不动 | 旋转方式为不旋转 + 步数为 0;或脚本没启动 | 检查方向值、步数、绿旗是否点击 |
| 角色倒着走 | 旋转方式用了任意旋转 | 改成左右翻转 |
| 角色绕着角转 | 造型旋转中心偏移 | 造型编辑器里把中心点拖回中间 |
| 角色跑到界外不回来 | 坐标超范围 | 加边界判断或重置坐标 |
| 滑行被"打断" | 滑行期间有其他运动指令 | 检查是否有并行脚本 |
| 贴边抖动 | 步长过大 + 反弹 | 减小步数或改用坐标判断 |
| 角色半截陷进地板 | 中心点在造型中间,y 设得太低 | 上移 y 或调整旋转中心 |
| 转 4 次 90 度后判断失效 | 方向值折算回 0 | 判断改用区间而非等值 |
6. 分层任务与后续延伸
6.1 三档任务卡怎么设计
同一个班里的孩子水平差异很大,统一任务必然有人吃不饱有人跟不上。我的做法是准备三档任务卡,全部围绕运动模块,但难度递进。
基础档:让角色从中心点出发,向右移动 150 步,再向上移动 100 步,最后回到原点。要求写出完整积木并说出每一步后的坐标。这档练的是坐标计算和顺序执行。
进阶档:用键盘控制角色在舞台内漫游,要求角色不出界、不倒着走、按左右键时造型朝向正确。这档练的是方向、旋转方式和条件判断的组合。
挑战档:做一个"自动巡逻 + 遇边界转向"的角色,要求路线是自己设计的非矩形路径,且全程不依赖"碰到边缘就反弹"。这档练的是坐标判断和状态切换,也是最能拉开差距的一档。
三档任务不是按成绩分配的,而是让孩子自己选,选完做不出来可以降档。我发现这种做法比强制分配更能激发主动性,孩子知道自己有退路,反而更敢挑战。
6.2 作业与评价怎么落地
运动模块的作业我从来不留"抄一遍积木"这种,全部是"做出效果"。评价标准也很简单:能不能跑起来、能不能说清楚为什么这么写、遇到问题能不能自己定位。
我常用的作业形式是"改错题":给一段有明显 bug 的脚本截图(比如旋转方式设错、边界判断写反、循环次数不对),让孩子找出问题并说明原因。这种题比让他们从零写更能检验理解程度,因为找错需要真正理解每块积木的行为。
另一个好用的形式是"参数挑战":给定目标效果(比如角色 3 秒走完一圈),让孩子自己算步数和等待时间。这类题没有唯一答案,只要算得通就行,能同时练计算和调试。
6.3 运动模块往后接什么
运动模块讲完,我通常直接接"外观模块"里的造型切换,做走路动画——角色一边移动一边换造型,视觉效果立刻上一个台阶。这一步会自然引出"重复执行"和"等待"的配合,也为后面讲克隆做铺垫。
再往后可以接"侦测模块"里的"碰到颜色""碰到角色",做简单的碰撞检测。这时候孩子已经能理解坐标和位置,判断"两个角色是否接触"就不再抽象。我在实际带班中观察到,运动模块学扎实的孩子,后面学克隆和变量时明显更顺,因为他们脑子里始终有"位置、方向、状态"这三个锚点。
最后分享一个我自己常用的小技巧:讲完所有积木后,我会留五分钟做"盲操作"——我说一个目标坐标,孩子不许看屏幕,先在纸上算出需要怎么移动,然后再运行验证。这个小环节看着幼稚,但能非常有效地筛出"只会拖积木、不会算"的孩子,也让他们意识到编程里"想清楚"永远比"敲得快"重要。带过几轮之后我发现,那些在盲操作环节表现好的孩子,后面学条件判断和循环嵌套时几乎不费劲,因为他们的思维习惯已经建立起来了。