Im Gegensatz zu Parent-Skripten wird die Objektreferenz auf ein Verhalten in der Regel nicht in einer Variablen gespeichert, sondern ist einem bestimmten Sprite zugeordnet. Mit dem Befehl sendSprite bietet Lingo die Möglichkeit, gezielt die Methoden der Verhalten eines Sprites aufzurufen. Die Syntax ähnelt dem call-Befehl:
sendSprite (Spritenummer, #handlerName, {argumente...})
Spritenummer bezeichnet die Nummer des Sprites, dessen Methode aufgerufen werden soll. Der Name des Handlers wird, genau wie bei call und callAncestor, als Symbol angegeben. Optional können der Methode Argumente übergeben werden. Achtung: Auch beim Methodenaufruf mit sendSprite wird als ersters Argument die Objektreferenz (me) übergeben.
Der Aufruf
sendSprite (1, #ausgabe, "Ich bin's.")
ruft die Methode im Verhalten von Sprite 1 auf:
on ausgabe me, ausgabeText
put "Sprite" && me.spritenum && "meldet:"
&& ausgabeText
end ausgabe
Die Ausgabe im Nachrichtenfenster lautet:
-- Sprite 1 meldet: Ich bin's.
Der Methodenaufruf mit sendSprite hält sich
an die übliche Reihenfolge bei der Abarbeitung von Ereignissen (Events).
In der Regel wird die auszuführende Methode in allen Verhalten ausgeführt,
die einem Sprite zugeordnet sind. Ist keine entsprechende Methode vorhanden,
wird im Darstellerskript, Frameskript und schließlich im Filmskript weitergesucht,
wobei ein vorhandener Handler die Eventkette beendet. Mit dem Befehl pass lässt
sich der Aufruf explizit an die jeweils nächste Ebene weitergeben. Entsprechend
kann mit dem Befehl stopEvent verhindert werden,
dass der Aufruf von einem Verhalten an ein anderes weitergegeben wird (siehe
"Das Director Event-Modell").
Wenn keine Methode bzw. kein Handler mit dem angegebenen Namen existiert, wird keine Fehlermeldung ausgegeben.
Obwohl der Name des sendSprite-Befehls nahe legt, dass es sich um eine einseitige Kommunikation handelt, können die Methoden durchaus Werte zurückliefern. Dies ist z.B. beim Abfragen von Eigenschaften sinnvoll. Die folgende Methode liefert den ancestor des Verhaltens zurück.
on getAncestor me
return ancestor
end getAncestor
Folgende Zeile speichert den ancestor dieses Verhaltens auf Sprite 3 in der Variablen thisAncestor:
thisAncestor = sendSprite(3, #getAncestor)
Sind mehrere Verhalten mit dem gleichen Methodennamen einem Sprite zugeordnet, wird der Wert des zuletzt aufgerufenen Verhaltens zurückgeliefert. Ist keine Methode mit entsprechendem Namen vorhanden, wird VOID zurückgeliefert.
Die Eigenschaften eines Verhaltens lassen sich auch über
sprite(Spritenummer).Eigenschaftsname
abfragen. In diesem Fall muss diese Eigenschaft aber auf jeden Fall vorhanden sein, da Lingo ansonsten einen Fehler meldet. Im Gegensatz zum Ermitteln eines Methodenwertes mit sendSprite wird nicht der letzte, sondern der erste verfügbare Wert zurückgeliefert.
Analog dazu ist es auch möglich, eine Methode über die Syntax
sprite(Spritenummer).Methodenname()
aufzurufen. Dies entspricht einem Aufruf durch sendSprite mit folgenden Unterschieden:
Bemerkung
Director erzeugt Verhaltensinstanzen erst im laufenden Film. Daher können
Eigenschaftwerte von Verhalten in einem angehaltenen Film weder direkt, noch
über eine Methode abgefragt werden, da sie noch nicht initialisiert sind.
Die Werte, mit denen die Eigenschaften initialisiert werden, sind im Verhaltensinspektor
ersichtlich. Sollte es nötig sein, diese Werte per Lingo zu ermitteln,
kann dazu der undokumentierte Befehl the scriptList of
sprite benutzt werden.
Mit dem Befehl sendAllSprites wird eine Methode in allen Sprites eines Frames aufgerufen. Er arbeitet ansonsten genauso wie sendSprite.
sendAllSprites (#handlerName, {argumente...})
Bemerkung
Methodenaufrufe mit sendSprite/sendAllSprites
und das direkte Abfragen von Verhaltenseigenschaften können sich auf mehrere
Objekte beziehen und sind daher nicht eindeutig. Dies kann zu Fehlern führen,
die schwer zu finden sind. Außerdem ist es schwieriger als bei Child-Objekten,
Eigenschaftswerte abzufragen und zu überwachen. Daher ist es ratsam, Verhalten
vor allem für das Verarbeiten von Ereignissen einzusetzen. Ein Vorschlag
für eine sinnvolle Kombination von Verhalten und Objekten findet sich im
Unterkapitel
"Kommunikation zwischen Verhalten und Objekten".
![]() |
|||
![]() |
5.8 Ermitteln des Sprites zu einem Verhalten mit the spriteNum | 5.10 Ermitteln der Verhalten zu einem Sprite mit the scriptInstanceList und the scriptList | ![]() |