Scratch 正弦波源码拆解:sin 函数只有两行,但藏着这个秘密.


温馨提示
点
,点
,留言你对本案例的看法与评论
我们将留言者私信送出源码,感谢你的参与
scratch纯技术分享:如何画波浪?有点烧脑,但不多。
scratch作品动画教程《蜡笔小新冲浪》,画波浪案例应用。
上两期我们做了一个波浪线的效果,有一些老师和孩子表示看不懂,波形是怎么来的?为什么y坐标要这样算?今天的教程主要理解正弦波的理解和应用。
首先写一个正弦波的程序,效果如下动图:



每次循环,j 增加 10,然后把角色移到 x=240、y=sin(j)×160 的位置,克隆一个自己,克隆体再从右往左匀速移动,直到出了画面就删掉。
就这样,一条波浪线出来了。
sin 函数在算什么
sin 是正弦函数,初中数学里学过。给它一个角度,它返回一个 -1 到 1 之间的数。
比如:
-
sin(0°) = 0
-
sin(90°) = 1
-
sin(180°) = 0
-
sin(270°) = -1
-
sin(360°) = 0,回到起点,开始下一个周期
把这些点连起来,就是一条平滑的波浪曲线。
在程序里,j 从 0 开始,每帧加 10,相当于角度一直在增大。sin(j) 的值就在 -1 和 1 之间来回摆动,乘以 160 之后变成 -160 到 160,正好覆盖舞台的上下范围。
j 每次加多少,决定波的疏密。 加得多,角度跳得快,相邻两个克隆体之间的 y 差距大,波形看起来更”陡”、周期更短;加得少,波形更平缓、周期更长。上面动图是 i=10的效果。

【i=20的效果】
乘以多少,决定波的高低。 乘以 160 是振幅(动图效果),想让浪高一点就改大,想让浪矮一点就改小。

【振幅为80的效果】
克隆体为什么要分前后层
代码里有一段:

这是为了做出波浪”有厚度”的立体感。y 坐标大于 0 的克隆体(波峰,在上面)放到最前面,y 坐标小于 0 的(波谷,在下面)往后移。这样波峰会盖住波谷,看起来像一条有前后关系的立体波浪,而不是一条平面线。
sin 函数还能做什么
搞清楚 sin 的规律之后,能用它做的事情就多了。下面几个都是比较好上手的方向。
1. 角色左右摇摆
将x坐标设为 正弦(计时器 * 100) * 50
把 sin 的结果乘以一个数,赋给 x 坐标,角色就会在中心位置左右来回摆动。乘以的数越大,摆动幅度越大。计时器 * 100 控制摆动速度,数越大摆得越快。
用这个可以做钟摆、摇摆的树、随风飘动的旗子,甚至是跳舞的角色。

2. 角色上下浮动
将y坐标设为 正弦(计时器 * 80) * 20
和左右摇摆一样,只是改成 y 坐标。角色会在原位上下浮动,像漂在水面上的东西。
配合上一期的波浪背景,把角色的 y 坐标设成和波浪同步的 sin 值,角色就真的”骑”在浪上了。

3. 角色大小呼吸感
将大小设为 100 + 正弦(计时器 * 60) * 20
sin 值在 -1 到 1 之间变化,加上基础大小 100,乘以 20,角色大小就在 80 到 120 之间来回变化,有一种”呼吸”或者”心跳”的感觉。做游戏里的提示图标、闪烁的星星都很好用。

4. 颜色循环变化
将颜色特效设为 正弦(计时器 * 50) * 100 + 100
颜色特效的范围是 0 到 200,sin 值乘以 100 再加 100,正好在这个范围内来回扫。角色颜色会平滑地循环变化,不会突然跳色。

5. 画椭圆(sin 和 cos 配合)
这个单独说一下,因为要用到 cos(余弦)。
sin 和 cos 的关系是:cos 比 sin 提前了 90°,两个函数的波形完全一样,只是错开了一个相位。
如果同时用:
x = cos(角度) * 水平半径y = sin(角度) * 垂直半径
让角度从 0 增加到 360,x 和 y 就会同步变化,画出来的轨迹是一个椭圆。水平半径和垂直半径相等时就是正圆,不相等就是椭圆。这个我们下期单独出教程。

总结
sin 函数的核心就一句话:给一个不断增大的角度,它返回一个在 -1 到 1 之间平滑来回的值。
把这个值乘以不同的数,赋给 x、y、大小、颜色……就能让任何东西”有节奏地动起来”。
j 每帧加多少 → 控制变化速度(频率)乘以多少 → 控制变化幅度
这两个参数搞清楚,sin 函数就算真正用会了。

夜雨聆风