1 00:00:00,610 --> 00:00:02,872 此时,你可能已经意识到 2 00:00:03,128 --> 00:00:07,599 每次你想制作一个动画程序的时候, 都会用到一个特别的函数, 3 00:00:07,920 --> 00:00:09,301 那就是“draw”(画画)函数。 4 00:00:09,579 --> 00:00:11,989 提醒一下大家, 这是我们的汽车动画程序。 5 00:00:13,756 --> 00:00:16,606 记住我们已经输入了"var x=11" (给x赋值11)语句, 6 00:00:16,606 --> 00:00:18,310 ——这是汽车的起始位置, 7 00:00:18,310 --> 00:00:20,358 然后限定 “var draw” 函数, 然后写下所有画汽车的代码, 8 00:00:20,358 --> 00:00:23,183 然后我们改变X的值,X每次增加3, 9 00:00:23,183 --> 00:00:27,519 那汽车就可以启动了! 哇!轰隆轰隆轰隆! 10 00:00:27,519 --> 00:00:31,107 现在你已经学会如何制作自己的函数了, 11 00:00:31,107 --> 00:00:34,004 你可能会开始想, “这个‘draw’(画画)函数是什么东西?” 12 00:00:34,004 --> 00:00:36,901 “这是一个自定义函数吗? 为什么总是把它命名为‘draw’? ” 13 00:00:37,591 --> 00:00:39,798 嗯,这些都是很好的问题。 14 00:00:39,798 --> 00:00:43,222 你看,在我们可汗学院的运行环境中, 15 00:00:43,222 --> 00:00:47,436 有几个非常特别的全局函数, 我把它们称为“魔法函数”, 16 00:00:48,251 --> 00:00:49,767 但那只是我自己给它们起的名字。 17 00:00:50,511 --> 00:00:52,563 基本上,当我们运行你写的程序的时候, 18 00:00:52,846 --> 00:00:56,210 我们会先看你有没有用一些特定的名字 定义函数,例如“draw”(画画), 19 00:00:56,210 --> 00:00:59,686 如果你有用这些名字的话, 我们会在特定的时候调用它们。 20 00:00:59,686 --> 00:01:02,908 例如,当你在代码里定义了“draw”(画画)函数, 21 00:01:02,908 --> 00:01:07,329 那我们就会找到这个函数, 我们会分析该函数内的代码, 22 00:01:07,329 --> 00:01:12,028 然后我们反复调用该函数, 调用得越快越好。 23 00:01:12,028 --> 00:01:15,873 如果你不定义一个“draw(画画)函数”的话, 那我们就什么都不会调用, 24 00:01:15,873 --> 00:01:16,976 因为那里什么都没有。 25 00:01:18,097 --> 00:01:23,347 这也就意味着如果我们把这个函数 重命名为“drow”的话, 26 00:01:24,405 --> 00:01:25,446 ——好吧,它运行不了。 27 00:01:25,733 --> 00:01:27,324 或者重命名为“drawCar”, 28 00:01:27,637 --> 00:01:28,811 ——好吧,也运行不了。 29 00:01:29,271 --> 00:01:33,418 所以如果我们重命名这个函数, 程序就再也找不到它了。 30 00:01:33,418 --> 00:01:34,926 因为它就再也不叫“draw”(画画)了。 31 00:01:35,212 --> 00:01:37,346 最终它再也不能被反复调用, 32 00:01:37,346 --> 00:01:39,154 最终我们什么结果都得不到。 33 00:01:39,458 --> 00:01:42,871 所以,这就意味着你不应该把 你的自定义函数命名为“draw”(画画), 34 00:01:42,871 --> 00:01:45,499 除非你想要它被区别对待, 35 00:01:45,499 --> 00:01:48,048 或者反复调用它。 36 00:01:48,839 --> 00:01:51,808 “draw”(画画)函数并不是唯一的魔法函数。 37 00:01:51,808 --> 00:01:58,265 还有许多其他函数,在用户使用鼠标 或者敲击键盘的时候,它们可以作出反应。 38 00:01:59,022 --> 00:02:02,629 让我们来展示另外一个动画程序的例子。 39 00:02:02,629 --> 00:02:12,826 假如说,我们希望当用户移动鼠标的时候, 一个彩球能出现。 40 00:02:14,123 --> 00:02:16,941 我们输入“draw”(画画), 然后输入“fill”(填充)”和“ellipse”(椭圆), 41 00:02:16,941 --> 00:02:18,999 再输入(mouseX, mouseY, 10, 10) 42 00:02:18,999 --> 00:02:20,234 好了,我们来试一下。 43 00:02:20,568 --> 00:02:21,406 哇!好酷! 44 00:02:21,879 --> 00:02:24,524 这个这么酷的彩球就能不断出现了。 45 00:02:24,524 --> 00:02:28,192 这样子,这个函数, 这个“draw”(画画)函数里的代码 46 00:02:28,535 --> 00:02:30,261 就能被反复调用了, 47 00:02:30,574 --> 00:02:33,520 因为我们把它放在一个叫 “draw”(画画)的函数里。 48 00:02:33,520 --> 00:02:36,539 所以,即使用户没有移动鼠标,也能调用它们。 49 00:02:36,539 --> 00:02:39,628 现在我没有移动鼠标,但是它还是能被调用。 50 00:02:40,943 --> 00:02:46,620 其实,还有一种更好的、效率更高的方法。 51 00:02:47,583 --> 00:02:52,685 我们可以做的事就是把“draw”(画画)函数 改成“mouseMoved”(鼠标移动)函数。 52 00:02:54,478 --> 00:02:56,737 我们的运行环境会不断检查, 53 00:02:56,741 --> 00:02:59,217 看它们有没有定义一个叫 “mouseMoved”(鼠标移动)的函数。 54 00:02:59,536 --> 00:03:02,356 如果有的话,那只要用户移动鼠标, 它们就会调用该函数。 55 00:03:02,861 --> 00:03:05,720 再看看,现在它还能运行。 56 00:03:06,741 --> 00:03:10,406 但是,如果用户没有移动鼠标的话, 该函数就不会被调用。 57 00:03:10,406 --> 00:03:14,472 只要我不再移动我的鼠标, 它就不会被调用。 58 00:03:15,419 --> 00:03:17,165 还记得我们之前用“draw”(画画)函数的时候吗? 59 00:03:17,633 --> 00:03:22,013 即使我们没有移动鼠标, 代码也一直在被调用。 60 00:03:22,013 --> 00:03:23,219 但是现在我们用了“mouseMoved”这个函数, 61 00:03:23,420 --> 00:03:27,210 那就只有当我们需要,即鼠标实际移动的时候, 才会调用该代码。 62 00:03:27,387 --> 00:03:29,387 这样,我们的程序就变得高效多了。 63 00:03:29,693 --> 00:03:34,002 总体而言,如果你希望只有当用户移动鼠标时, 程序才输出结果, 64 00:03:34,317 --> 00:03:39,044 那么最好把代码放在“mouseMoved”函数里面, 而不是“draw”函数里面。 65 00:03:39,692 --> 00:03:43,895 还有很多像“mouseMoved”(鼠标移动) 这样的魔法函数,如: 66 00:03:43,895 --> 00:03:47,008 “mousePressed”(按击鼠标);“mouseReleased” (松开鼠标);“keyPressed”(敲击键盘)等, 67 00:03:47,008 --> 00:03:49,790 你可以在文件记录中看到所有这些函数。 68 00:03:50,305 --> 00:03:54,187 最关键的是要记住, 如果你想要使用魔法函数, 69 00:03:54,187 --> 00:03:55,523 一定要正确拼写它们。 70 00:03:55,523 --> 00:04:00,021 如果你不用魔法函数的话, 确保你会给你的自定义函数起一个新的名字。