Wir nutzen Cookies, um das allgemeine Benutzerelebnis zu verbessern. Mit der Nutzung unseres Wikis stimmst du der Nutzung von Cookies zu.

Ereignisorientierte Programmierung

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:

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.



Code zum Einbinden ins Forum:
[wiki=de:Ereignisorientierte Programmierung]Ereignisorientierte Programmierung[/wiki]