5.3 Das Director Event-Modell

Director bedient sich einer ereignisgesteuerten Metapher: Das Eintreten eines Ereignisses (oder Events) löst eine bestimmte Aktion aus. Ereignisse können vom Benutzer ausgelöst werden, zum Beispiel durch das Drücken einer Taste oder das Bewegen der Maus, oder durch Director selbst, beispielsweise beim Wechsel zu einem anderen Film oder Verlassen des aktuellen Frames. Ein Verhalten besteht in erster Linie aus Ereignishandlern, die diese Ereignisse verarbeiten. Im Zuge der Einführung von Verhalten hat sich die Zahl der verarbeiteten Ereignissen vergrößert; einerseits sind neue Ereignisse hinzugekommen, wie on beginSprite und on prepareFrame, andererseits sind in Spriteskripten nun Ereignishandler zulässig, die vorher nur im Frameskript abgearbeitet wurden, wie z.B. on exitFrame. Dadurch wird die Beschränkung aufgehoben, dass es nur ein Skript dieser Art pro Frame geben kann, im Gegensatz zum Skriptkanal können einem Sprite beliebig viele Verhalten zugeordnet werden.

5.3.1 Zeitlicher Ablauf von Director-Events
5.3.2 Die Ereigniskette

5.3.1 Zeitlicher Ablauf von Director-Events

Um Verhalten effizient einzusetzen, ist es sinnvoll, sich klar zu machen, wann Director welches Ereignis auslöst. Besonderes Augenmerk sollte zwei Aspekten geschenkt werden: wie oft wird ein Ereignis ausgelöst und wird es vor oder nach dem Zeichnen des Sprites auf der Bühne ausgelöst.

Die folgende Tabelle enthält die wichtigsten Director-gesteuerten Ereignisse.13

Ereignishandler Skripttypen Beschreibung
on prepareMovie Filmskript Wird beim Start eines Filmes ausgeführt, und zwar nachdem Darsteller geladen, aber bevor Verhaltensinstanzen erzeugt sind und die Bühne gezeichnet wird.
on startMovie Filmskript Wird beim Start eines Filmes ausgeführt, und zwar nachdem die Bühne gezeichnet wird.
on stopMovie Filmskript Wird ausgeführt, wenn der Film anhält.
on beginSprite Spriteskript, Frameskript Wird ausgeführt, wenn der Abspielkopf auf ein Sprite trifft, das im vorherigen Frame noch nicht existierte.
on stepFrame Objektskript in the actorlist Wird ausgeführt, wenn der Abspielkopf in einen neuen Frame wechselt oder updateStage ausgeführt wird, und zwar noch bevor on prepareFrame.
on prepareFrame Spriteskript, Frameskript, Movieskript Wird ausgeführt, wenn der Abspielkopf in einen neuen Frame wechselt, und zwar bevor der Frame gezeichnet wird.
on enterFrame Spriteskript, Frameskript, Movieskript Wird ausgeführt, wenn der Abspielkopf in einen neuen Frame wechselt, und zwar nachdem der Frame gezeichnet wird.
on idle Frameskript, Filmskript Wird ausgeführt, wenn der Film auf das Ende eines Frames wartet, mindestens jedoch 1x pro Frame.
on exitFrame Spriteskript, Frameskript, Movieskript Wird ausgeführt, wenn der Abspielkopf einen Frame verlässt.
on endSprite Spriteskript, Frameskript Wird ausgeführt, wenn der Abspielkopf ein Sprite verlässt, das im darauffolgenden Frame nicht mehr existiert.

Die folgende Grafik soll den Ablauf noch mal verdeutlichen:

5.3.2 Die Ereigniskette

Benutzer-Ereignisse, wie ein Mausklick oder ein Tastendruck, gehen in Director einen vorgeschriebenen Weg. Zuerst wird das Ereignis an den sogenannten primären Eventhandler weitergegeben, das ist das Skript, das in den Eigenschaften the mouseUpScript, the mouseDownScript, the keyUpscript und the keyDownScript angegeben ist. Wenn das Ereignis in einem Sprite aufgetreten ist, wenn z.B. auf das Sprite geklickt wurde, wird es zuerst an alle Verhalten weitergegeben. Wenn es hier nicht verarbeitet wird, geht es an das Darstellerskript weiter, daraufhin an das Frameskript und dann an das Filmskript. Dabei führt das Vorhandensein eines Eventhandlers in der Regel zum Abbruch der Eventkette, mit Ausnahme von zwei Fällen: der primäre Eventhandler reicht das Event standardmäßig durch, außerdem werden in der Regel alle Handler eines Verhaltens ausgeführt, auch wenn ein Verhalten schon den entsprechenden Eventhandler definiert.

Um die Ereigniskette zu beeinflussen, bietet Lingo die beiden Funktionen pass und stopEvent. Mit pass kann ein Weiterleiten des Ereignisses erzwungen werden, während stopEvent die Ereigniskette abbricht. Wenn einem Sprite mehrere Verhalten zugeordnet sind, kann z.B. das erste Verhalten darüber entscheiden, ob die Ereignisse an die restlichen Sprites weitergegeben werden. Das folgende Skript stellt so ein Verhalten dar. Es sollte an erster Stelle im Verhaltensinspektor stehen. Mit dem Aufruf sprite(x).setActive() wird es dazu veranlasst, alle Mausereignisse an weitere Verhalten des selben Sprites weiterzugeben. Mit dem Aufruf sprite(x).setInactive() schirmt es alle Mausereignisse ab. Darunter liegende Mausevent-Handler werden nicht mehr aufgerufen - das Sprite ist für Mausereignisse deaktiviert.

property mActive

on beginSprite me
mActive = false
end beginSprite

on setActive me
-- Mausevents werden fortan durchgereicht
mActive = true
end setActive

on setInactive me
-- Mausevents werden fortan gestoppt
mActive = false
end setInactive

on checkStatus me
-- stopt das Event, wenn Sprite inaktiv ist
if not mActive then
stopEvent
end if
end checkStatus

on mouseDown me
me.checkStatus()
end mouseDown

on mouseUp me
me.checkStatus()
end mouseUp

on mouseUpOutside me
me.checkStatus()
end mouseUpOutside

on rightMouseUp me
me.checkStatus()
end rightMouseUp

on mouseEnter me
me.checkStatus()
end mouseEnter

on mouseLeave me
me.checkStatus()
end mouseLeave

on mouseWithin me
me.checkStatus()
end mouseWithin

Der Handler on beginSprite wird dazu benutzt, die Eigenschaften des Verhaltens zu initialisieren. In unserem Fall wird festgesetzt, dass das Sprite zuerst einmal nicht aktiv ist. Es ist zu beachten, dass dieses Verhalten nur als erstes Verhalten eines Sprites wirksam ist! Die Reihenfolge, mit der Verhalten Sprites zugeordnet werden, ist also entscheidend. Eventuell muss die Reihenfolge mit den Sortieren-Buttons des Verhaltensinspektors geändert werden.

Quellcode des Beispiels

5.2 Was können Verhalten? 5.4 Beispiel 8: Der Rechte-Mausbutton-Bugfix