5.9 Senden von Nachrichten mit sendSprite und sendAllSprites

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:

  1. Die Methoden müssen vorhanden sein, sonst meldet Director einen Fehler.
  2. Der Methodenaufruf wird nicht in der Ereigniskette weitergereicht: es werden also nur die Methoden des der Sprite-Verhalten aufgerufen, nicht des Darsteller- oder Filmskriptes.

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