乐于分享
好东西不私藏

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

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 函数就算真正用会了。


图片与部分内容由AI生成