-
Du merkst vielleicht, dass du jedes Mal,
-
wenn du dein Programm animieren wolltest,
eine bestimmte Funktion verwendet hast -
-
die "draw"- Funktion.
-
Zur Erinnerung hier nochmal
unser animiertes Auto-Programm.
-
Es hat die Variable x, die bei 11 anfängt.
-
Und in der "draw"-Funktion malt es
das Auto bei dieser Variable x
-
und fügt dann jedes Mal drei zu
dieser Variable x hinzu.
-
Und dadurch bekommen wir ein Auto,
-
das sich konstant drei Pixel schnell
über den Bildschirm bewegt.
-
So funktioniert das.
-
Aber jetzt, wo du gelernt hast,
eigene Funktionen zu machen,
-
könntest du dich fragen,
"Was ist diese "draw"-Funktion?"
-
"Warum heißt sie immer "draw"?"
-
"Ist das eine vorgegebene Funktion?"
-
Und das sind gute Fragen.
-
Weißt du, in der ProcessingJS-Bibliothek
-
ist die "draw"-Funktion eine von wenigen
vordefinierten Funktionen,
-
die unseren Programmen mehr Kontrolle
darüber geben, was passiert.
-
Eine vordefinierte Funktion ist eine
Funktion, die schon von der
-
ProcessingJS-Bibliothek definiert wurde.
-
Aber sie fängt üblicherweise als
eine leere Definition an.
-
Zum Beispiel gibt es in der ProcessingJS-
Bibliothek Code, der so aussieht:
-
'var draw = function() { }'
-
und dann ist sie einfach leer,
komplett leer.
-
Wir laden die ProcessingJS-Bibliothek
in jedes Programm hier auf Khanacademy,
-
also siehst du diesen Code nie.
-
Aber glaub mir, er existiert.
-
Den Code verstecke ich mit "comment",
da ProcessingJS das schon für uns macht.
-
Wenn du jetzt in deinem eigenen Programm
"draw" neu definierst, überschreibt
-
diese neue Definition die alte.
-
Und jetzt macht die "draw"-Funktion
-
spannende Dinge,
zB. malt sie ein Auto.
-
Jetzt ist die Frage: Warum wird die
"draw"-Funktion immer wiederholt?
-
Nun ja, in der ProcessingJS-Bibliothek
ist auch Code, der einen
-
Browser-Timer setzt und die
"draw"-Funktion wiederholt aufruft,
-
wieder und wieder und wieder.
-
Wir müssen die Funktion "draw" nennen,
weil das der Name
-
der Funktion ist, die ProcessingJS
wiederholt aufruft.
-
Wenn wir ihr einen neuen Namen geben,
nehmen wir "drawCar",
-
bekommen wir einen undefinierten Fehler,
also sagen wir 'var drawCar.
-
Jetzt kannst du sehen, dass wir, wenn wir
sie zu "drawCar" umbenennen,
-
keine Animation mehr sehen.
-
Und das liegt daran, dass die Funktion
-
nicht wiederholt aufgerufen wird,
weil sie nicht "draw" heißt.
-
Also müssen wir Code, den wir
mehrmals aufrufen wollen,
-
in eine Funktion namens "draw" einfügen.
-
Also werde ich das wieder tun und einfach
"drawCar" von hier aufrufen.
-
Aha! Wir haben es wieder.
-
Okay, also muss es "draw" heißen,
-
und das heißt auch, dass du deine eigenen
Funktionen nicht "draw" nennen solltest,
-
es sei denn, du willst, dass sie besonders
behandelt und wiederholt aufgerufen werden.
-
Und denk dran, du kannst nicht mehrere
Funktionen haben, die "draw" heißen.
-
Nur die letzte Definition zählt.
-
Wenn wir hierdrin ein "rect" hätten--
-
Jetzt können wir sehen, dass unser Auto
nicht mehr gemalt wird
-
und stattdessen nur das Rechteck,
weil nur die letzte Definition zählt.
-
Also lass uns das löschen.
-
"draw" ist nicht die einzige
vordefinierte Funktion,
-
die dieses besondere Verhalten hat.
-
Es gibt auch einen Haufen Funktionen,
-
die auf Mausbewegungen und
Tastatur reagieren.
-
Zum Beispiel wollen wir ein Programm, das
eine farbige Ellipse dahin malt,
-
wo der Nutzer seine Maus hinbewegt.
-
Das könnten wir mit einer solchen
Funktion machen.
-
[tippt]
-
Okay, oh, das ist schön.
-
Jetzt wird diese Funktion immer wieder
aufgerufen,
-
selbst wenn der Nutzer die Maus
gar nicht bewegt, so wie jetzt.
-
Und dieses Programm funktioniert,
es tut, was wir wollen
-
es malt diese tollen Ellipsen überall
auf den Bildschirm.
-
Aber tatsächlich gibt es eine bessere Art,
das Gleiche zu tun,
-
die effizienter ist.
-
Ändern wir die "draw"-Funktion
zu "mouseMoved"
-
funktioniert es immer noch.
-
Es ist so, unsere Umgebung überprüft
Programme,
-
um zu sehen, ob eine "mouseMoved"-Funktion
darin definiert wurde, und wenn ja,
-
ruft sie die Funktion auf, wenn die Maus
bewegt wird.
-
Aber sie wird nicht aufgerufen werden,
wenn der Nutzer die Maus nicht bewegt.
-
Also, vorher haben wir den Code in der
"draw"-Funktion aufgerufen,
-
als wir es nicht mussten, immer wieder.
-
Und jetzt rufen wir nur diesen Code
in "mouseMoved" auf,
-
wenn mouseX oder mouseY
sich tatsächlich ändern.
-
Also ist unser Programm effizienter,
und das ist gut.
-
Allgemein, wenn du nur dann den
Programm-Output ändern willst,
-
wenn der Nutzer die Maus bewegt,
ist es besser, diesen Code
-
in der "mouseMoved"-Funktion zu haben.
-
Und es gibt noch viel mehr
vordefinierte Funktionen,
-
von denen du Beispiele in der
Dokumentation sehen kannst.
-
So wie "mousePressed", "mouseReleased",
"keyPressed" und weitere.
-
Also denk dran, wenn du eine spezielle
vordefinierte Funktion verwenden willst,
-
wie "mouseMoved" oder "draw",
dann schreibe und verwende sie richtig.
-
Wenn du das nicht willst, stell sicher,
dass deine eigenen Funktionen
-
neue, einzigartige Namen haben.