Hasta este punto, te habrás dado cuenta de que has definido
una función particular cada vez que quieres animar un programa,
la función "draw".
Para recordártelo, aquí está nuestro programa del carro animado nuevamente.
Tiene esta variable llamada "x" y que está inicializada en 11.
Y luego dentro de la función "draw", se dibuja el carro en la variable "x",
y luego suma 3 a la variable cada vez.
Y eso da como resultado un carro
que se mueve tres pixeles continuamente a lo largo de la pantalla.
Así es como funciona.
Pero ahora que has aprendido cómo hacer tus propias funciones,
probablemente te preguntes, ¿qué pasa con la función "draw"?
¿Por qué siempre la llamamos "draw"?
¿Es una función personalizada?
Y esas son muy buenas preguntas.
Verás, en la librería "ProcessingJS",
la función "draw" es una de las pocas funciones predefinidas
que da a nuestros programas más control sobre lo que pasa en la pantalla.
Una función predefinida es una función que ha sido definida
por la librería "ProcessingJS".
Pero generalmente comienza como una definición vacía.
Por ejemplo, en la librería "ProcessingJS", hay un código que se ve así:
"var draw = function() {}"
y luego está vacío, completamente vacío.
Ahora, llamamos a la librería "ProcessingJS" en cada programa que hacemos en Khan Academy,
Así que nunca ves ese código.
Pero creeme, existe.
Ahora, voy a comentar el código, ya que "ProcessingJS" lo hace por nosotros.
Cuando defines "draw" en nuestro programa,
esta nueva definición anula la definición anterior.
Y ahora la función "draw"
en realidad hace cosas emocionantes, como dibujar un carro.
Ahora, la pregunta es, ¿por qué la función "draw" se llama repetidas veces?
Bueno, también hay código en la librería "ProcessingJS"
que establece un temporizador del navegador y llama a la función repetidamente,
una vez tras otra.
Tenemos que darle a la función el nombre de "draw" porque es el nombre de la función
que la librería "ProcessingJS" está llamando repetidamente.
Si renombramos esta función como... digamos "drawCar",
en primer lugar obtendremos un error de definición, así que tendríamos que decir "var drawCar".
Entonces ahora puedes ver que si renombramos esto como "drawCar",
no vemos ninguna animación.
Y esto es porque esta función no se está llamando repetidamente,
porque no se llama "draw".
Así que tenemos que poner el código que queremos que se llame repetidamente
dentro de una función a la que nombremos "draw" exactamente.
Así que voy a hacerlo de nuevo, y voy a llamar a "drawCar" desde aquí.
¡Ajá! Lo tenemos nuevamente.
Muy bien, así que se debe llamar "draw",
y esto también significa que no deberías llamar "draw" a tus funciones personalizadas,
a menos que quieras que se consideren de una manera especial y que sean llamadas una y otra vez.
Y recuerda también que no puedes tener muchas funciones llamadas "draw".
Sólo la última sería considerada.
Si tenemos "rect" aquí dentro
Entonces ahora podemos ver que nuestro carro ya no se está dibujando,
y sólo se está dibujando "rect" en su lugar, porque sólo se considera la última definición.
Así que vamos a deshacernos de ésta.
Ahora, la función "draw" no es la única función predefinida
que tiene este comportamiento especial.
Hay muchas otras funciones también,
para responder a las interacciones del ratón y al uso de teclas.
Digamos que queremos tener un programa que dibuja una elipse coloreada
por donde el usuario pasa el ratón.
Podríamos hacer eso con una función como ésta...
digamos "mouseX, mouseY, mouseY" y luego "ellipse(mouseX, mouseY, 10, 10)"
Muy bien, oh, hermoso.
Ahora, esta función se está llamando una y otra vez,
aún cuando el usuario no está moviendo el ratón, como en este momento.
Y este programa, funciona, hace lo que queremos que haga,
está pintando esas lindas elipses por toda la pantalla.
Pero resulta que hay una mejor manera de hacer lo mismo
y que es más eficiente.
Entonces podemos cambiar la función "draw" a "mouseMoved" y vamos a ver.
Sigue funcionando.
Verás, nuestro entorno revisa los programas
para ver si se ha definido una función "mouseMoved",
y si se ha hecho, llama a la función cada vez que el usuario mueve el ratón.
Pero no se llamará si el usuario no mueve el ratón.
Así que antes, estábamos llamando al código de la función "draw"
cuando no lo necesitábamos, una y otra vez.
Y ahora, sólo llamamos al código en "mouseMoved"
cuando "mouseX" o "mouseY" han cambiado.
Así que nuestro programa es más eficiente y eso es algo bueno.
Generalmente, si sólo quieres cambiar el resultado de tu programa
cuando el usuario mueve el ratón, entonces es mejor que tengas tu código
dentro de la función "mouseMoved".
Y existen muchas funciones predefinidas como ésta,
puedes ver más ejemplos en la documentación.
Como "mousePressed", "mouseReleased", "keyPressed", y otras.
Así que recuerda, si quieres usar una función especial predefinida,
como "mouseMoved" o "draw", escríbelas correctamente, y úsalas correctamente.
Si no es así, entonces asegurate de que los nombres de tus funciones
sean nuevos y únicos.