At this point, you might realize
that you've been defining
a particular function every time
you wanted to animate your program--
the `draw` function.
To remind you, here's our
animated car program again.
It has this variable named x,
it starts off at 11.
And then inside the `draw` function,
it draws the car at that variable x,
and then it adds three
to that variable x each time.
And that results in a car
that's moving three pixels
across the screen continuously.
So, that's how this works.
But now that you've learned
how to make your own functions,
you might be wondering,
what about this `draw` function?
Why is it always named `draw`?
Is it a custom function?
And those are very good questions.
You see, in the ProcessingJS library,
the `draw` function is one of
a few predefined functions
that give our programs more control
over what's happening with the canvas.
A predefined function is one
that has already been defined
by the ProcessingJS library.
But it usually starts off
as an empty definition.
For example, in the ProcessingJS library,
there's code that looks like this:
`var draw = function() `
and then it's just empty,
completely empty.
Now, we load the ProcessingJS library
into every program here on Khan Academy,
So you never see this code.
But trust me, it exists.
Now I'll comment that code out,
since ProcessingJS already does it for us.
Now when you redefine `draw`,
in your own program,
this new definition overrides
the old empty defintion.
And now the `draw` function
actually does exciting things,
like drawing a car.
Now the question is, why does the `draw`
function get called over and over?
Well, there's also code
in the ProcessingJS library
that sets a browser timer and
recalls the draw function repeatedly,
over and over and over.
We have to name the function `draw`,
because that's the name of the function
that ProcessingJS is calling repeatedly.
If we rename this, like let's say
we rename it to `drawCar`.
And first we get an undefined error, so
we could say `var drawCar`.
So now you can see, if we
rename this to `drawCar`,
we don't see any animation any more.
And that's because this function
isn't being called repeatedly any more,
because it's not named draw.
So we have to put the code
that we want repeatedly called
inside a function spelled `draw` exactly.
So I'll just do it again,
and I'll just call `drawCar` from here.
Aha! We've got it back.
All right, so it needs to be called draw,
and this also means that you shouldn't
name your own custom functions `draw`,
unless you want them to be
treated specially and called over and over.
And also remember, you can't have
multiple functions named `draw`.
Only the last definition will count.
If we had a `rect` inside here--
So now we can see that our car
isn't being drawn any more,
and only the rect is being drawn instead,
because only the last defintion counts.
So let's get rid of that one.
Now the draw function is not the
only predefined function
that has this special behavior.
There are also a bunch of functions
for responding to mouse
interactions and keypresses.
Let's say we want to have a program
that draws a colored ellipse
wherever the user moves the mouse.
So we could do that with
a function like this.
[typing]
All right, oh, beautiful.
Now, this function is being called
over and over,
even when the user isn't
moving the mouse, like right now.
And this program, it works, it does
what we want it to do,
it's painting these nice ellipses
all over the screen.
But as it turns out, there's
a better way to do the same thing
that's more efficient.
So we can change the `draw` function
to `mouseMoved`, and let's see.
And it still works.
You see, our environment checks programs
to see if they've defined
a `mouseMoved` function,
and if so, it calls that function
whenever the user moves the mouse.
But it won't be called
if the user isn't moving the mouse.
So before, we were calling
the code in the `draw` function
when we didn't need to, over and over.
And now, we're only calling
this code in `mouseMoved`
when the mouseX or mouseY
have actually changed.
So our program is more efficient,
and that's a good thing.
Generally, if you only want to
change your program output
when the user moves the mouse,
then it's better to have that code
inside the `mouseMoved` function.
And there are a bunch more
predefined functions like that,
which you can see more examples of
in the documentation.
Like `mousePressed`, `mouseReleased`,
`keyPressed`, and more.
So remember, if you want to use
a special predefined function,
like `mouseMoved` or `draw`,
spell it correctly, and use it correctly.
If you don't, then make sure you
give your own custom functions
a new, unique name.