WEBVTT 00:00:00.610 --> 00:00:02.872 此时,你可能已经意识到 00:00:03.128 --> 00:00:07.599 每次你想制作一个动画程序的时候, 都会用到一个特别的函数, 00:00:07.920 --> 00:00:09.301 那就是“draw”(画画)函数。 00:00:09.579 --> 00:00:11.989 提醒一下大家, 这是我们的汽车动画程序。 00:00:13.756 --> 00:00:16.606 记住我们已经输入了"var x=11" (给x赋值11)语句, 00:00:16.606 --> 00:00:18.310 ——这是汽车的起始位置, 00:00:18.310 --> 00:00:20.358 然后限定 “var draw” 函数, 然后写下所有画汽车的代码, 00:00:20.358 --> 00:00:23.183 然后我们改变X的值,X每次增加3, 00:00:23.183 --> 00:00:27.519 那汽车就可以启动了! 哇!轰隆轰隆轰隆! 00:00:27.519 --> 00:00:31.107 现在你已经学会如何制作自己的函数了, 00:00:31.107 --> 00:00:34.004 你可能会开始想, “这个‘draw’(画画)函数是什么东西?” 00:00:34.004 --> 00:00:36.901 “这是一个自定义函数吗? 为什么总是把它命名为‘draw’? ” 00:00:37.591 --> 00:00:39.798 嗯,这些都是很好的问题。 00:00:39.798 --> 00:00:43.222 你看,在我们可汗学院的运行环境中, 00:00:43.222 --> 00:00:47.436 有几个非常特别的全局函数, 我把它们称为“魔法函数”, 00:00:48.251 --> 00:00:49.767 但那只是我自己给它们起的名字。 00:00:50.511 --> 00:00:52.563 基本上,当我们运行你写的程序的时候, 00:00:52.846 --> 00:00:56.210 我们会先看你有没有用一些特定的名字 定义函数,例如“draw”(画画), 00:00:56.210 --> 00:00:59.686 如果你有用这些名字的话, 我们会在特定的时候调用它们。 00:00:59.686 --> 00:01:02.908 例如,当你在代码里定义了“draw”(画画)函数, 00:01:02.908 --> 00:01:07.329 那我们就会找到这个函数, 我们会分析该函数内的代码, 00:01:07.329 --> 00:01:12.028 然后我们反复调用该函数, 调用得越快越好。 00:01:12.028 --> 00:01:15.873 如果你不定义一个“draw(画画)函数”的话, 那我们就什么都不会调用, 00:01:15.873 --> 00:01:16.976 因为那里什么都没有。 00:01:18.097 --> 00:01:23.347 这也就意味着如果我们把这个函数 重命名为“drow”的话, 00:01:24.405 --> 00:01:25.446 ——好吧,它运行不了。 00:01:25.733 --> 00:01:27.324 或者重命名为“drawCar”, 00:01:27.637 --> 00:01:28.811 ——好吧,也运行不了。 00:01:29.271 --> 00:01:33.418 所以如果我们重命名这个函数, 程序就再也找不到它了。 00:01:33.418 --> 00:01:34.926 因为它就再也不叫“draw”(画画)了。 00:01:35.212 --> 00:01:37.346 最终它再也不能被反复调用, 00:01:37.346 --> 00:01:39.154 最终我们什么结果都得不到。 00:01:39.458 --> 00:01:42.871 所以,这就意味着你不应该把 你的自定义函数命名为“draw”(画画), 00:01:42.871 --> 00:01:45.499 除非你想要它被区别对待, 00:01:45.499 --> 00:01:48.048 或者反复调用它。 00:01:48.839 --> 00:01:51.808 “draw”(画画)函数并不是唯一的魔法函数。 00:01:51.808 --> 00:01:58.265 还有许多其他函数,在用户使用鼠标 或者敲击键盘的时候,它们可以作出反应。 00:01:59.022 --> 00:02:02.629 让我们来展示另外一个动画程序的例子。 00:02:02.629 --> 00:02:12.826 假如说,我们希望当用户移动鼠标的时候, 一个彩球能出现。 00:02:14.123 --> 00:02:16.941 我们输入“draw”(画画), 然后输入“fill”(填充)”和“ellipse”(椭圆), 00:02:16.941 --> 00:02:18.999 再输入(mouseX, mouseY, 10, 10) 00:02:18.999 --> 00:02:20.234 好了,我们来试一下。 00:02:20.568 --> 00:02:21.406 哇!好酷! 00:02:21.879 --> 00:02:24.524 这个这么酷的彩球就能不断出现了。 00:02:24.524 --> 00:02:28.192 这样子,这个函数, 这个“draw”(画画)函数里的代码 00:02:28.535 --> 00:02:30.261 就能被反复调用了, 00:02:30.574 --> 00:02:33.520 因为我们把它放在一个叫 “draw”(画画)的函数里。 00:02:33.520 --> 00:02:36.539 所以,即使用户没有移动鼠标,也能调用它们。 00:02:36.539 --> 00:02:39.628 现在我没有移动鼠标,但是它还是能被调用。 00:02:40.943 --> 00:02:46.620 其实,还有一种更好的、效率更高的方法。 00:02:47.583 --> 00:02:52.685 我们可以做的事就是把“draw”(画画)函数 改成“mouseMoved”(鼠标移动)函数。 00:02:54.478 --> 00:02:56.737 我们的运行环境会不断检查, 00:02:56.741 --> 00:02:59.217 看它们有没有定义一个叫 “mouseMoved”(鼠标移动)的函数。 00:02:59.536 --> 00:03:02.356 如果有的话,那只要用户移动鼠标, 它们就会调用该函数。 00:03:02.861 --> 00:03:05.720 再看看,现在它还能运行。 00:03:06.741 --> 00:03:10.406 但是,如果用户没有移动鼠标的话, 该函数就不会被调用。 00:03:10.406 --> 00:03:14.472 只要我不再移动我的鼠标, 它就不会被调用。 00:03:15.419 --> 00:03:17.165 还记得我们之前用“draw”(画画)函数的时候吗? 00:03:17.633 --> 00:03:22.013 即使我们没有移动鼠标, 代码也一直在被调用。 00:03:22.013 --> 00:03:23.219 但是现在我们用了“mouseMoved”这个函数, 00:03:23.420 --> 00:03:27.210 那就只有当我们需要,即鼠标实际移动的时候, 才会调用该代码。 00:03:27.387 --> 00:03:29.387 这样,我们的程序就变得高效多了。 00:03:29.693 --> 00:03:34.002 总体而言,如果你希望只有当用户移动鼠标时, 程序才输出结果, 00:03:34.317 --> 00:03:39.044 那么最好把代码放在“mouseMoved”函数里面, 而不是“draw”函数里面。 00:03:39.692 --> 00:03:43.895 还有很多像“mouseMoved”(鼠标移动) 这样的魔法函数,如: 00:03:43.895 --> 00:03:47.008 “mousePressed”(按击鼠标);“mouseReleased” (松开鼠标);“keyPressed”(敲击键盘)等, 00:03:47.008 --> 00:03:49.790 你可以在文件记录中看到所有这些函数。 00:03:50.305 --> 00:03:54.187 最关键的是要记住, 如果你想要使用魔法函数, 00:03:54.187 --> 00:03:55.523 一定要正确拼写它们。 00:03:55.523 --> 00:04:00.021 如果你不用魔法函数的话, 确保你会给你的自定义函数起一个新的名字。