5.4 Beispiel 8: Der Rechte-Mausbutton-Bugfix

Das abschließende Beispiel ist ein Skript aus der Praxis und soll zeigen, dass sich Eventhandler benutzen lassen wie gewöhnliche Methoden. Das rightMouseBugFix-Verhalten beseitigt einen Fehler in Director, der auftritt, wenn man eine PC-Maus mit zwei Maustasten benutzt. Hält man die linke Taste gedrückt und betätigt kurz die rechte, erhält Director kein mouseUp-Event mehr. Das macht sich z.B. negativ bemerkbar, wenn man ein Objekt per "Drag & Drop" bewegt und unbeabsichtigt auf die rechte Taste kommt: das Objekt bleibt am Mauszeiger hängen und wird nicht mehr abgesetzt.

Das folgende Skript dient dazu, diesen Fehler nachzuvollziehen. Es ist ein einfaches "Drag & Drop"-Skript, das auf ein Sprite auf der Bühne, z.B. ein Bitmap, gezogen werden sollte.

property mClickOffset, spriteNum

on mouseDown me
set mClickOffset = the loc of sprite spriteNum - the clickLoc
(the actorlist).add(me)
end mouseDown

on mouseUp me
(the actorlist).deleteOne(me)
end mouseUp

on stepframe me
sprite(spriteNum).loc = the mouseLoc + mClickOffset
end stepframe

Kommt man beim Ziehen der Grafik auf die rechte Maustaste, lässt sich das gezogene Objekt nicht mehr absetzen.

Dieser Fehler lässt sich leicht und universell mit dem rightMouseBugFixObj-Skript beheben.

-- dieses Objekt ist allen behaviors hinzuzufügen; es verhindert,
-- daß folgender Bug sich negativ auswirkt:
-- hält man unter Windows die linke Maustaste gedrückt
-- und klickt mit der rechten, wird kein Mausup-Event ausgelöst
-- Lösung: jeder rightMouseUp bei gedrückter linker Maustaste wird
-- behandelt wie ein Klick auf den linken Mausbutton

on rightMouseUp me
if the mouseDown then
me.mouseUp()
end if
end rightMouseUp

Wenn die rechte Maustaste losgelassen wird, wird geprüft, ob gerade die linke Taste gedrückt ist. Wenn dies der Fall ist, wird einfach das mouseUp-Skript des Objektes (bzw. der Unterklasse) aufgerufen. Dadurch wird das gezogene Objekt abgesetzt.

Nun muss nur noch in unserem Drag&Drop-Verhalten das rightMouseBugFixObj als ancestor definiert werden.

property ancestor

on beginSprite me
ancestor = new(script "rightMouseBugFixObj")
end beginSprite

Der Bugfix lässt sich so leicht für sämtliche Verhalten eines Films einsetzen.

Quellcode des Beispiels

5.3 Das Director Event-Modell 5.5 Anzeige von Informationen mit on getBehaviorDescription und on getBehaviorTooltip