Aus Das deutschsprachige Scratch-Wiki
Ereignisorientierte Programmierung ist Programmierung, bei der die Skripte von Ereignissen abhängen, welche Nachrichten in Scratch entsprechen. Zum Beispiel könnte das Ereignis „Wenn die Maus bewegt wurde“ alle Skripte auslösen, wenn die Maus bewegt wurde. Ereignisse haben ihre eigenen Attribute, sogenannte Ereignisattribute. Im vorigen Beispiel könnte das Ereignis die Attribute „aktuelle Maus-x-Position“, „vorige Maus-x-Position“, „bewegte Strecke“ etc. haben.
Ereignisse in Scratch
Ein Ereignisblock, auch Kopf-Block genannt, stellt ein Ereignis in Scratch dar. Folgende Blöcke sind die in Scratch implementierten Ereignisse:
- Wenn Grüne Flagge angeklickt
- Wenn Taste () gedrückt
- Wenn ich angeklickt werde
- Wenn das Bühnenbild zu () wechselt
- Wenn () > ()
- Wenn ich () empfange
Tutorials
Dieses Tutorial zeigt die Skripte zu folgenden Ereignissen:
- Wenn die Maus bewegt wurde
- Wenn die Maus heruntergedrückt/losgelassen/gedrückt wurde
- Wenn eine Taste heruntergedrückt/losgelassen/gedrückt wurde
- Ereignisformate
Wenn die Maus bewegt wurde
Ein „Wenn die Maus bewegt wurde“-Ereignis ist nicht als expliziter Block in Scratch verfügbar, kann jedoch leicht mit anderen Blöcken nachgebaut werden. In anderen Programmiersprachen löst dieses Ereignis bestimmten Quellcode aus, sobald die Maus bewegt wurde. Dabei muss die Maus nicht über ein bestimmtes Objekt o.Ä. bewegt werden. Das Bewegen der Maus über ein bestimmtes Objekt wird in Programmiersprachen oft „hover“ (engl. „schweben“) genannt und wird häufig in CSS benutzt.
Ein simples Scratch-Skript, das überprüft, ob die Maus bewegt wurde, sieht etwa so aus:
Wenn gf angeklickt wiederhole fortlaufend setze [letztesMausX v] auf (Maus x-Position) setze [letztesMausY v] auf (Maus y-Position) warte (0) Sek. // Framepause, damit die folgende Abfrage nicht in demselben Frame überprüft wird falls <nicht <<(letztesMausX) = (Maus x-Position)> und <(letztesMausY) = (Maus y-Position)>>> dann ... end end
Wenn die Maus heruntergedrückt/losgelassen/gedrückt wurde
Dieses Ereignis ist die Zusammenfassung folgender Ereignisse:
- Wenn die Maus heruntergedrückt wurde ("Maus unten")
- Wenn die Maus losgelassen wurde ("Maus oben")
- Wenn die Maus gedrückt wurde (für weniger als 0,4 Sekunden)
Hier sind die Skripte:
Wenn gf angeklickt wiederhole fortlaufend warte bis <Maustaste gedrückt?> sende [Maus unten v] an alle warte bis <nicht <Maustaste gedrückt?>> sende [Maus oben v] an alle end Wenn gf angeklickt wiederhole fortlaufend warte bis <Maustaste gedrückt?> warte (0.4) Sek. falls <Maustaste gedrückt?> dann warte bis <nicht <Maustaste gedrückt?>> sonst sende [Maus gedrückt v] an alle end end
Wenn eine Taste heruntergedrückt/losgelassen/gedrückt wurde
Dieses Ereignis ist im Grunde dasselbe wie das vorige, bloß wird diesmal statt der Maus die Tastatur verwendet.
Wenn gf angeklickt wiederhole fortlaufend warte bis <Taste [Taste v] gedrückt?> sende [Taste unten v] an alle warte bis <nicht <Taste [Taste v] gedrückt?>> sende [Taste oben v] an alle end Wenn gf angeklickt wiederhole fortlaufend warte bis <Taste [Taste v] gedrückt?> warte (0.4) Sek. falls <Taste [Taste v] gedrückt?> dann warte bis <nicht <Taste [Taste v] gedrückt?>> sonst sende [Taste gedrückt v] an alle end end
Variablenabfrage-Alternative
Nicht alle Programmiersprachen besitzen viele voreingestellte Ereignisse, manche können nicht einmal mehrere Skripte gleichzeitig ausführen (Multi-Threading). Daher werden Variablen oft als Ersatz für Ereignisse benutzt. Eine Variable speichert einen veränderlichen Wert, der durch Abfragen in einer Schleife bestimmte Skripte ausführen kann. Ein Beispiel:
Wenn ich angeklickt werde ...
Kann mit diesem Skript umgangen werden:
Wenn gf angeklickt wiederhole fortlaufend falls <<wird [Mauszeiger v] berührt?> und <Maustaste gedrückt?>> dann ... end end
Beide haben fast dieselbe Funktionalität, jedoch haben sie einen großen technischen Unterschied. Der von Scratch bereitgestellte Ereignisblock berücksichtigt auch ein zweites Anklicken während die Skripte des ersten Klicks noch ausgeführt werden. Die Skripte werden dann allerdings nicht parallel ausgeführt; der erste Durchlauf wird unterbrochen und das Skript wird einfach erneut von oben abgearbeitet. Dies kann zu unerwünschten Ergebnissen führen.
Das zweite Beispiel wird nicht unterbrochen, sondern muss erst komplett abgearbeitet worden sein, bevor ein weiterer Klick registriert werden kann. Also eignet sich die Ereignisblock-Variante eher für den Fall, dass man Unterbrechungen zulassen möchte, und die variablenbasierte Methode für den Fall, dass das Skript vollständig ausgeführt werden soll.
[wiki=de:Ereignisorientierte Programmierung]Ereignisorientierte Programmierung[/wiki]