Film im Film

Ein MIAW, ein sogenanntes "Movie in a window", ist zunächst mal nichts anderes als ein Director-Movie in einem Extra-Fenster über der Bühne. Dennoch gibt es eine Reihe zusätzlicher Möglichkeiten im Gegensatz zu einem normalen Director-Film, die die Verwendung von MIAWs interessant machen können.

Aufgrund der Tatsache, daß bei der Verwendung von MIAWs mehrere Director-Filme gleichzeitig ablaufen, gestaltet sich die Programmierung solcher Filme etwas anders als bei normalen Projekten. So muß zum Beispiel darauf geachtet werden, daß eine Kommunikation zwischen der Bühne und dem MIAW stattfinden kann. Dabei gibt es zwei Möglichkeiten, entweder das MIAW spricht mit der Bühne, oder die Bühne mit dem MIAW. Sollten mehrere MIAWs gleichzeitig geöffnet sein, so sollten Sie immer über den Umweg der Bühne miteinander kommunizieren. Dies empfehlen jedenfalls wärmstens die Handbücher.

Spezielle Lingo-Befehle
Die Verwendung von MIAWs eröffnet die Nutzung neuer Lingo-Befehle in den Filmen. So findet etwa die Kommunikation zwischen der Bühne und einem MIAW immer über den "tell"-Befehl statt. Auch kann das MIAW über denselben Befehl mit der Bühne Informationen austauschen.

Wie erhalt man ein MIAW?
Zur Öffnung eines Fensters über der Bühne verwendet man sinnigerweise...

open window NAME

wobei NAME entweder direkt der Name des zu verwendenden Director-Filmes sein kann, oder ein ganz eigener Name für das Fenster (z.B. "Infofenster"). Wenn Director also einen entsprechenden benannten Film in seinem Suchpfad findet, so öffnet er diesen sofort als neues MIAW, ansonsten muß man mit

set the filename of window NAME="Film.DIR"

nochmal explizit den zu verwendenden Film angeben. Mit

set the rect of window NAME=rect[0,0,230,230]

kann man die Größe des MIAWs vorgeben. Ansonsten wird das Fenster mit den Vorgaben des evtl. angegebenen Filmes geöffnet, oder aber in einer festen Größe falls kein Film übergeben wurde.

Als kleines Beispiel sei es mal empfohlen, im Nachrichtenfenster von Director direkt mal einzugeben:

open window "Credits.dcr"

MIAW1.gif - 18485 Bytes

Dies öffnet den kleinen "Über Director..."-Film als MIAW, der auch unter dem Hilfe-Menü zu finden ist.


The WindowList
Director verwaltet eine globale Liste über alle geöffnete MIAWs. Diese spezielle Liste heißt

the windowList.

Nach dem Öffnen eines MIAWs mittels

open window "miaw"

steht in the windowList:

put the windowList
-- [(window "miaw")]

Diese Liste verwaltet also alle geöffneten Fenster mit dem angegebenen Namen. Die Einträge in der Liste wachsen natürlich auch mit dem Öffnen eines jeden weiteren MIAWs mit.

MIAWs können als Sprites oder als Fenster verstanden werden: man kann sie wie Sprites unsichtbar machen (set the visible of window "NAME" to false) oder sie durch Anklicken des entsprechenden Buttons runterklicken (nicht zu verwechseln mit dem Schließen eines Fensters). Das wird in Director "zoomen" genannt und dafür gibt es einen enstsprechenden Handler, der aufgerufen werden kann, ganz vergleichbar zu einem "on mouseup" für ein Sprite:

on zoomWindow
tue dies, tue das
end

Denkbare Verwendungen dafür wären etwa die Neupositionierung von Sprites auf der Bühne, angepaßt an die neue Größe des Fenters (trickreich, aber machbar), oder die Nutzung zur Mitteilung an die Bühne (wenn Fenster gezoomt ist, dann tue etwas bestimmtes).

Ein Fenster kann also wie ein Sprite unsichtbar machen. Dennoch ist es dann immer noch formal "geöffnet" und kann jederzeit wieder mit

set the visible of window "NAME" to true

wieder sichtbar gemacht werden. Ein Fenster kann auch mit

close window "NAME"

geschlossen werden. Dennoch ist es immer noch nicht weg, sondern vielmehr wieder nur unsichtbar. Somit sind "set the visible of window"NAME"=false" und close Window "Name" gleichwertig. Ein Fenster wird erst richtig aus dem Speicher entfernt mit

forget window "Name"

Dann ist das Fenster tatsächlich geschlossen und es erscheint auch kein entsprechender Eintrag mehr in "the windowList".

Die FensterIcons wie etwa das "Schließen"-Symbol ("X") oben rechts bei Windows-Fenstern schließen ein MIAW entgegen aller Erwartungen nicht, sondern machen es einmal mehr nur unsichtbar.

Soll etwas vor dem Schließen noch getan werden, so hilft ein "on closeWindow"-Handler beim Abfangen der Aktion:

on closeWindow
Speichern
tell the stage
forget window "MeinName"
end tell
end


Man beachte dabei, daß das Fenster der Bühne sagt, daß Sie es vergessen soll. Somit räumt sich das MIAW nicht selber weg, sondern bittet darum, weggeräumt zu werden.

Der Fenstertyp

Wie bereits erwöhnt gibt es eine Reihe von Lingo-Befehlen, die MIAW-spezifisch sind. Ein Befehl ist der

set the windowType-Befehl.

Damit kann man einstellen, was für eine Art Fenster für das MIAW geöffnet werden soll. Es gibt eine Reihe von Werten, die dafür benutzt werden können.

Fenster0.gif - 1209 Bytes
set the windowType of window "miaw"=0
Fenster1.gif - 732 Bytes
set the windowType of window "miaw"=1
Fenster2.gif - 612 Bytes
set the windowType of window "miaw"=2
Fenster3.gif - 617 Bytes
set the windowType of window "miaw"=3
Fenster4.gif - 1134 Bytes
set the windowType of window "miaw"=4
Fenster12.gif - 1217 Bytes
set the windowType of window "miaw"=12
Fenster16.gif - 1138 Bytes
set the windowType of window "miaw"=16
Fenster49.gif - 977 Bytes
set the windowType of window "miaw"=49

Natürlich unterscheiden sich die Fenster auf Windows und Mac Plattformen. Des weiteren gibt es auf dem Mac noch Sprechblasenfenster im Bereich von 1980-2048, welche angeblich systemeigen sein sollen. Aufgrund des fehlenden Macs kann ich aber darüber keine Aussagen machen. Selber versuchen macht schlau.

Was kann man nun mit MIAWs machen?
Vor einiger Zeit hat es in der Liste eine Anfrage gegeben, daß ein Hauptfilm auf der Bühne mehrere kleinere Bilder darstellen sollte. Klickt nun der User auf eines der Bilder, so sollte ein MIAW aufgehen, in dem das entsprechende Bild größer dargestellt werden sollte. Diese Aufgabenstellung läßt sich sehr einfach und elegant mit Hilfe eines Tricks bewerkstelligen.

Zunächst braucht man aber natürlich seine Bühne mit den entsprechenden Bildern: ich habe mir im Beispielfilm damit beholfen, drei Screenshots der Website zu nehmen. Alle drei Bilder stehen auf der Bühne und können angeklickt werden:

MIAW4.gif - 27812 Bytes


Beim Anklicken wird ein MIAW geöffnet, welches nur ein leeres Dummy-Bild oben links in der Ecke auf seiner eigenen Bühne stehen hat. Das MIAW loopt mit einem "go to the frame" immer auf demselben Bild.

MIAW3.gif - 11537 Bytes


Zurück zum Haupfilm
Beim Anklicken eines Bildes im Hauptfilm wird das Bild des Darstellers dem MIAW übergeben mit der Bitte, das Bild des Dummy-Bildchens gegen das Spritebild auszutauschen:

on mouseup me
set bild=the picture of member (the member of sprite the spritenum of me)
-- setze die Variable Bild auf das Bild des angeklickten Sprites

if count(the windowList)< then
-- wenn noch kein MIAW offen
open window "miaw"
else
-- sonst zumachen und vergessen close window "miaw"
forget window "miaw"
end if

set the rect of window "miaw"=the rect of member (the member of sprite the spritenum of me)
-- setze die Größe des MIAWs auf die Größe des Bildes, welches übergeben werden soll

tell window "miaw"

set the picture of member "Dumy" to Bild
-- sag MIAW, daß es Darsteller "Dumy" mit das Bild in der Variable BILD geben soll
-- dies ersetzt das Ursprungsbild mit dem angeklickten Sprite.

set the regPoint of member "Dumy" to point(0,0)
-- ein wenig Kosmetik:
-- der Registrierungspunkt des neuen Bildes wird
-- wieder auf die linke oebere Ecke gesetzt (0,0)
-- dann klappts auch mit der Position im MIAW.

end tell


end

Der eigentliche Trick in diesem Listing ist somit die Übergabe des Bildes mittels einer Variable in einen vollkommen neuen Film.

Weitere Tricks mit MIAWs
Die Handbücher zu Director weisen darauf hin, daß auch Funktionen im Hauptfilm von einem MIAW aus aufgerufen werden können. Funktionen sind Unterprogramme, die Werte als Ergebnis zurückliefern:

on Beispielfunktion
set Wert=Wert * random(50)
if Wert=50 then
return true
else
return false
end if
end

Diese oben dargestellte Funktion nimmt einen WERT entgegen, multipliziert ihn mit einem Zufallswert von 1 - 50 und prüft dann das Ergebnis. Wenn WERT nun genau 50 ist, dann wird WAHR (TRUE) zurückgegeben, ansonsten FALSCH (FALSE). Zugegeben, diese Funktion ist etwas künstlich, aber wichtig ist in diesem Zusammenhang nur, daß auch ein MIAW darauf zurückgreifen könnte, wenn diese Funktion Teil des Hauptfilmes wäre:

im MIAW:

tell the stage
Beispielfunktion (2)
end tell

Das Ergebniss des Aufrufes wäre dann in einer speziellen Systemvariable zu finden, die da heißt the result. Somit kann das MIAW nach Aufruf der Funktion im Haupfilm das Ergebnis überprüfen und sich dementsprechend verhalten:

Im MIAW:
...
tell the stage
Beispielfunktion (2)
end tell

If the result=true then
alert "Hurra, der Wert der Funktion ist genau 50!"
else
nothing
end if
...

Natürlich kann the result auch für andere Zwecke mißbraucht werden, so etwa auch zur weiter oben dargestellten Übergabe eines Medienelementes an das MIAW:

im MIAW:

tell the stage
do "return the media of member "&quote&"NAME"&QUOTE
end tell


Hier bittet das MIAW den Hauptfilm um die Übergabe des Mediums des Darstellers "NAME". Das MIAW kann es sich dann in der Variable the result abholen:"

im MIAW:

tell the stage
do "return the media of member "&quote&"NAME"&QUOTE
end tell

set the media of member "MIAW-DARSTELLER" = the result


Damit wäre ein MIAW also von außen programmierbar. Die Besetzung kann dynamisch geändert werden, wobei der Medientyp keine Rolle spielt. Somit könnte ein MIAW weniger als eigener Film programmiert als vielmehr zu einer Schablone umfunktioniert werden, in der von der Hauptbühne aus dynamisch neue Elemente plaziert werden.

MIAWs eignen sich für viele Dinge: denkbar wären Zum Beispiel eine Art Fernbedienung, mit der sich der Benutzer durch verschiedene Filme zappen kann oder auch ein Zusatztool wie etwa ein Taschenrechner oder ein Notizblock zu einem Programm.

MIAW-Demo - Movie gezippt für PC, Demo für MAC (Projektor + Sourcen)

Alle Skripte dürfen frei und auch für kommerzielle Zwecke verwendet werden. Es wäre nett, wenn ich in einem solchen Falle einen kurzen Hinweis zugemailt bekäme.

Christophe Leske für Direct@r_List (c) 1998