[Script Info] Title: [Events] Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text Dialogue: 0,0:00:01.38,0:00:03.65,Default,,0000,0000,0000,,现在我们谈谈你这期间 Dialogue: 0,0:00:03.65,0:00:05.68,Default,,0000,0000,0000,,一直在用的 函数 Dialogue: 0,0:00:05.68,0:00:09.14,Default,,0000,0000,0000,,当你使用 rect() fill() text() 这些命令时 Dialogue: 0,0:00:09.14,0:00:12.38,Default,,0000,0000,0000,,你其实是在调用函数 这些函数就会实现 Dialogue: 0,0:00:12.38,0:00:15.13,Default,,0000,0000,0000,,你所叫它们做的事情 Dialogue: 0,0:00:15.13,0:00:16.81,Default,,0000,0000,0000,,函数究竟是什么 Dialogue: 0,0:00:16.81,0:00:19.48,Default,,0000,0000,0000,,我们把一堆代码凑到一起 Dialogue: 0,0:00:19.48,0:00:21.24,Default,,0000,0000,0000,,并给它取个名字 好让我们能 Dialogue: 0,0:00:21.24,0:00:23.17,Default,,0000,0000,0000,,多次使用它的功能 Dialogue: 0,0:00:23.37,0:00:25.98,Default,,0000,0000,0000,,比如rect() 它是用来干什么的 Dialogue: 0,0:00:25.98,0:00:28.55,Default,,0000,0000,0000,,它就是用来画四条线的 是吧 Dialogue: 0,0:00:28.55,0:00:31.14,Default,,0000,0000,0000,,而我们也可以只用line()这个函数 是吧 Dialogue: 0,0:00:31.14,0:00:33.85,Default,,0000,0000,0000,,这样我们就得到了一个长方形样的东西 Dialogue: 0,0:00:33.85,0:00:36.75,Default,,0000,0000,0000,,但当我们想要 Dialogue: 0,0:00:36.75,0:00:39.32,Default,,0000,0000,0000,,画很多个长方形的时候 Dialogue: 0,0:00:39.32,0:00:40.77,Default,,0000,0000,0000,,那么每次都进行这些计算 Dialogue: 0,0:00:40.77,0:00:42.78,Default,,0000,0000,0000,,就相当地烦人了 还要费劲地思考 Dialogue: 0,0:00:42.78,0:00:44.28,Default,,0000,0000,0000,,这个角的这条线要怎么画 Dialogue: 0,0:00:44.28,0:00:45.82,Default,,0000,0000,0000,,那个角的要怎么画... Dialogue: 0,0:00:45.82,0:00:48.54,Default,,0000,0000,0000,,所以不如用个rect()函数 Dialogue: 0,0:00:48.54,0:00:50.86,Default,,0000,0000,0000,,这个函数的效果跟之前 Dialogue: 0,0:00:50.86,0:00:55.15,Default,,0000,0000,0000,,那四行代码的效果一样 却又更加简洁 Dialogue: 0,0:00:55.15,0:00:58.40,Default,,0000,0000,0000,,这样还挺棒的 rect()这个函数 Dialogue: 0,0:00:58.40,0:01:00.52,Default,,0000,0000,0000,,在可汗学院的所有的程序中 Dialogue: 0,0:01:00.52,0:01:02.73,Default,,0000,0000,0000,,都是能直接用的 Dialogue: 0,0:01:02.73,0:01:05.34,Default,,0000,0000,0000,,当然你也可以自己写个函数 Dialogue: 0,0:01:05.34,0:01:08.41,Default,,0000,0000,0000,,然后在自己的程序里调用 Dialogue: 0,0:01:08.41,0:01:11.43,Default,,0000,0000,0000,,举个栗子 假设我们要写个程序 Dialogue: 0,0:01:11.43,0:01:14.43,Default,,0000,0000,0000,,我们想画很多次的温斯顿(黄脸娃娃) Dialogue: 0,0:01:14.43,0:01:17.02,Default,,0000,0000,0000,,因为我们可能会讲讲温斯顿的人生历程 Dialogue: 0,0:01:17.02,0:01:20.19,Default,,0000,0000,0000,,并把每个年龄段的它都展示出来 Dialogue: 0,0:01:20.19,0:01:24.24,Default,,0000,0000,0000,,所以我们开始写画出温斯顿的代码了 Dialogue: 0,0:01:24.24,0:01:27.11,Default,,0000,0000,0000,,我们这里用 faceX 和 faceY 两个变量 Dialogue: 0,0:01:27.11,0:01:29.03,Default,,0000,0000,0000,,来规定脸部的中心位置 Dialogue: 0,0:01:29.03,0:01:31.24,Default,,0000,0000,0000,,之后画眼睛和鼻子的时候 Dialogue: 0,0:01:31.24,0:01:33.04,Default,,0000,0000,0000,,就能参照这两个变量了 Dialogue: 0,0:01:33.04,0:01:34.73,Default,,0000,0000,0000,,现在程序认得这些代码了 Dialogue: 0,0:01:34.73,0:01:37.32,Default,,0000,0000,0000,,但它还不是函数 所以程序运行了一下 Dialogue: 0,0:01:37.32,0:01:39.74,Default,,0000,0000,0000,,然后也只能就运行一次 Dialogue: 0,0:01:39.74,0:01:43.72,Default,,0000,0000,0000,,所以我们就来把它转成函数吧 Dialogue: 0,0:01:43.72,0:01:46.44,Default,,0000,0000,0000,,转化的步骤很像 Dialogue: 0,0:01:46.44,0:01:48.49,Default,,0000,0000,0000,,声明变量那样 因为实际上 Dialogue: 0,0:01:48.49,0:01:50.24,Default,,0000,0000,0000,,就是一样的 Dialogue: 0,0:01:50.24,0:01:52.08,Default,,0000,0000,0000,,我们敲上 var drawWinston Dialogue: 0,0:01:52.08,0:01:54.55,Default,,0000,0000,0000,,这个名字不错 生动又形象 Dialogue: 0,0:01:54.55,0:01:59.04,Default,,0000,0000,0000,,再敲上 = 号 然后接的就不是数字或字符串了 Dialogue: 0,0:01:59.04,0:02:02.72,Default,,0000,0000,0000,,我们要接的是 function 不要拼写错了 Dialogue: 0,0:02:02.72,0:02:08.36,Default,,0000,0000,0000,,然后是小括号 () 再后是前大括号 { Dialogue: 0,0:02:08.36,0:02:11.56,Default,,0000,0000,0000,,接着后大括号 } 最后是分号 ; Dialogue: 0,0:02:11.56,0:02:14.49,Default,,0000,0000,0000,,所以我们接下来就是要把所有 Dialogue: 0,0:02:14.49,0:02:19.45,Default,,0000,0000,0000,,函数要用的功能都放进大括号里 Dialogue: 0,0:02:19.45,0:02:22.13,Default,,0000,0000,0000,,所以我们要把底下的所有代码 Dialogue: 0,0:02:22.13,0:02:26.82,Default,,0000,0000,0000,,都放进我们的函数里 缩进下更好看 啦啦 Dialogue: 0,0:02:26.82,0:02:28.97,Default,,0000,0000,0000,,所以我们现在就把这些变量 Dialogue: 0,0:02:28.97,0:02:32.38,Default,,0000,0000,0000,,整理成函数了 基本上我们是 Dialogue: 0,0:02:32.38,0:02:35.76,Default,,0000,0000,0000,,把这块代码贴上了个标签 然后我们就能 Dialogue: 0,0:02:35.76,0:02:37.86,Default,,0000,0000,0000,,随时告诉自己的程序: Dialogue: 0,0:02:37.86,0:02:40.76,Default,,0000,0000,0000,,嘿 找出带那标签的那段代码 运行它! Dialogue: 0,0:02:40.76,0:02:43.55,Default,,0000,0000,0000,,我们把这段代码转成可重复使用的了 Dialogue: 0,0:02:43.55,0:02:46.54,Default,,0000,0000,0000,,但是别忘了 温斯顿不见了 Dialogue: 0,0:02:46.54,0:02:49.36,Default,,0000,0000,0000,,我们弄丢了温斯顿 他人跑去哪儿了呢 Dialogue: 0,0:02:49.36,0:02:53.02,Default,,0000,0000,0000,,好吧 其实是我们把代码放进函数里之后 Dialogue: 0,0:02:53.02,0:02:55.91,Default,,0000,0000,0000,,相当于是告诉程序 嘿 这里的这些代码 Dialogue: 0,0:02:55.91,0:02:57.84,Default,,0000,0000,0000,,是我想稍后还能用的 Dialogue: 0,0:02:57.84,0:03:00.81,Default,,0000,0000,0000,,但只有我叫你用时 你才能用 Dialogue: 0,0:03:00.81,0:03:04.29,Default,,0000,0000,0000,,所以我们就得叫程序运行这段代码 Dialogue: 0,0:03:04.29,0:03:09.11,Default,,0000,0000,0000,,这就要“调用”函数 就跟使用ellipse() rect() line()一样 Dialogue: 0,0:03:09.40,0:03:13.75,Default,,0000,0000,0000,,所以我们只要敲上函数名 drawWinston Dialogue: 0,0:03:13.75,0:03:16.38,Default,,0000,0000,0000,,后面接上小括号() Dialogue: 0,0:03:16.38,0:03:18.96,Default,,0000,0000,0000,,还有记得加上分号 啦啦 Dialogue: 0,0:03:18.96,0:03:20.94,Default,,0000,0000,0000,,温斯顿出来了 Dialogue: 0,0:03:20.94,0:03:24.24,Default,,0000,0000,0000,,好了 我觉得棒极了 但你可能无语了 Dialogue: 0,0:03:24.24,0:03:27.37,Default,,0000,0000,0000,,因为我们相当于是把之前程序所做的 Dialogue: 0,0:03:27.37,0:03:30.24,Default,,0000,0000,0000,,又做了一遍 有点傻是吧 Dialogue: 0,0:03:30.24,0:03:32.92,Default,,0000,0000,0000,,不过函数的关键就是它能重复使用 Dialogue: 0,0:03:32.92,0:03:34.96,Default,,0000,0000,0000,,所以我们现在要开工了 Dialogue: 0,0:03:34.96,0:03:41.16,Default,,0000,0000,0000,,我们只需不断复制黏贴这个函数就可以了 Dialogue: 0,0:03:41.16,0:03:46.57,Default,,0000,0000,0000,,额... 看起来没变嘛 但其实是有的 Dialogue: 0,0:03:46.57,0:03:48.100,Default,,0000,0000,0000,,它画了多个温斯顿 可问题在于 Dialogue: 0,0:03:48.100,0:03:51.47,Default,,0000,0000,0000,,它们完全重叠在一起了 Dialogue: 0,0:03:51.47,0:03:54.43,Default,,0000,0000,0000,,如果有X光的话 我们就可以扫一下那图象 Dialogue: 0,0:03:54.43,0:03:57.63,Default,,0000,0000,0000,,然后就能看到三个温斯顿了 但我可没X光眼 Dialogue: 0,0:03:57.63,0:04:00.33,Default,,0000,0000,0000,,也许你有吧 Dialogue: 0,0:04:00.33,0:04:03.44,Default,,0000,0000,0000,,但我们可以对函数做些小修改 Dialogue: 0,0:04:03.44,0:04:05.49,Default,,0000,0000,0000,,然后就能看到了 Dialogue: 0,0:04:05.49,0:04:08.82,Default,,0000,0000,0000,,你看 faceX 和 faceY 总是202和208没有 Dialogue: 0,0:04:08.82,0:04:11.59,Default,,0000,0000,0000,,我们能用 random() 函数来做点改变 Dialogue: 0,0:04:11.59,0:04:14.85,Default,,0000,0000,0000,,比如 random() 范围设成50到350 它就会 Dialogue: 0,0:04:14.85,0:04:19.18,Default,,0000,0000,0000,,在范围里随机挑选一个数字 下面也是一样 Dialogue: 0,0:04:19.18,0:04:23.02,Default,,0000,0000,0000,,这样每次调用这个函数时 它都会随机生成新数 Dialogue: 0,0:04:23.02,0:04:26.57,Default,,0000,0000,0000,,如果我们点下刷新 温斯顿就会随机再现 Dialogue: 0,0:04:26.57,0:04:29.36,Default,,0000,0000,0000,,棒呆了 哇 Dialogue: 0,0:04:29.36,0:04:32.10,Default,,0000,0000,0000,,好了 我觉得这棒极了 因为本来这是要 Dialogue: 0,0:04:32.10,0:04:34.92,Default,,0000,0000,0000,,写很多代码才能实现的 而有函数就省事多了 Dialogue: 0,0:04:34.92,0:04:38.32,Default,,0000,0000,0000,,本来是要当前代码量的三倍的 Dialogue: 0,0:04:38.32,0:04:40.96,Default,,0000,0000,0000,,不过这还不够实用 Dialogue: 0,0:04:40.96,0:04:43.80,Default,,0000,0000,0000,,因为我们也许不想要随机的温斯顿 Dialogue: 0,0:04:43.80,0:04:45.74,Default,,0000,0000,0000,,我们可能想要的是固定的温斯顿 Dialogue: 0,0:04:45.74,0:04:47.85,Default,,0000,0000,0000,,想让它固定在屏幕的某个特定位置 Dialogue: 0,0:04:47.85,0:04:49.94,Default,,0000,0000,0000,,那么敬请期待 因为下次我们就会讲 Dialogue: 0,0:04:49.94,0:04:52.48,Default,,0000,0000,0000,,如何给这个函数传递参数 从而得到 Dialogue: 0,0:04:52.00,0:04:56.00,Default,,0000,0000,0000,,位置固定的温斯顿