HowTo:
Bis 256 Klickbereiche in einer Grafik
|
|
Home
Workshop-Seite
|
Dies ist die erweiterte
Fassung eines Abschnittes aus dem Buch "Director 7 Workshop".
Zur Einsetzbarkeit auf den verschiedenen Plattformen beachten Sie
bitte folgenden wichtigen
Hinweis!
Eine in Director 7 neu
eingeführte, aber undokumentierte Funktion macht es möglich,
Farbwerte eines Bitmapdarstellers in RGB auszulesen. Das bietet
die Möglichkeit, eine am Bildschirm unsichtbare "Clickmap"
anzulegen, die prinzipiell für jeden Farbwert eine andere Aktion
starten kann also (theoretisch) Millionen Klickbereiche.
Sinnvollerweise sollte die Clickmap aber in 8 Bit Farbtiefe angelegt
werden. Bis zu 256 Hotspots im Bild sollten immer noch mehr als
genug sein, und die Bearbeitung ist deutlich einfacher.
|


 |
|
|
|
Hinweis von Joachim
Kathmann: Diese Technik funktioniert nicht auf Windows.
- Anmerkung von mir: HMPFF. Stimmt. Hätte ich
mal testen müssen... Es gibt einen Bug in Director 7.0
und der deutschen 7.01, der die Koordinaten von getPixel unter
Windows durcheinanderbringt. In 7.02 (hier)
ist das Problem behoben. Aber: In Shockwave (Windows)
wird es natürlich noch so lange weiterbestehen, wie der
Player nicht auf 7.02 upgedatet wurde. Im Projektor und in
der Authoring-Umgebung funktioniert alles.
Noch ein Hinweis:
Für die Technik (in ein Xtra verpackt) kann man auch
199 US-$ bezahlen.
Hehe, nicht schlecht. Kauft
es !
7.02 - mehr Bugs:
Leider geht es weiter mit den Bugs mit dieser Funktion. Zur
Erinnerung: Es handelt sich um eine undokumentierte und nicht
unterstützte Funktion in Director 7 man kann also
kaum Macromedia einen Vorwurf machen... Unser Beispiel muß
folgendermaßen verändert werden, damit es in Director
7.02 MAC funktioniert (auch Shockwave 7.02 Mac):
-- das funktioniert
in 7.0 und 7.01
mycolorref = mymapmember.getpixel(mymemberpoint[1], mymemberpoint[2])
-- das ist in 7.02Mac hinzuzufügen, um das gleiche Ergebnis
zu bekommen
mycolorref = 255 - mycolorref
Die Farbreferenzen
von getpixel() sind in 7.02 Mac demnach exakt invertiert.
|
|


 |
|
|
In unserem Beispiel soll
das Papageienbild Hotspots erhalten, die genau die Form des Schnabels
oder das Auge nachbilden. Legen Sie dafür einen leeren Bitmapdarsteller
in 8 Bit Farbtiefe an, der im Besetzungsfenster direkt auf das Ausgangsbild
folgt. Schalten Sie ZWIEBELSCHICHTEN im Menü ANSICHT ein, sodaß
Sie im leeren Darsteller das Papageienbild durchscheinen sehen.
Zeichnen Sie nun einzelne Teile mit Farben der aktuellen Palette
nach und notieren Sie sich die Farbwerte (INDEX-Eintrag im Farben-Aufklappmenü
des Malfensters). Die Abbildung zeigt eine detaillierte Clickmap,
die folgender Zuordnung im Script entspricht:
specialslist = [225: "grüne
Kappe", 101: "Gesichtsweiß", 215: "Gesichtsmaserung", 148:"Auge",
132:"Schnabel", 5: "gelbe Federn", 239:"Nasenloch"]
Die Zahlenwerte entsprechen
den Indexnummern der Farben, denen hier in einer Propertylist die
Bezeichnungen zugewiesen werden.

Ein alternativer Weg,
eine farbenabhängige Clickmap zu erzeugen, ist, eine Farbreduktion
ohne Dithering durchzuführen (MODIFIZIEREN / BITMAP TRANSFORMIEREN...).
Auch dabei entstehen Farbflächen, die Sie je nach Ausgangsbild
für eine Clickmap nutzen können.
|


 |
|
|
Ziehen Sie das Ausgangsbild
auf die Bühne und weisen Sie ihm folgendes Behavior zu:
property mymapmember,
specialslist
on beginsprite
me
mymapmember
= member(sprite(me.spritenum).membernum +1)
specialslist = [225: "grüne Kappe", 101:
¬
"Gesichtsweiß", 215: "Gesichtsmaserung", 148:"Auge", ¬
132:"Schnabel",5: "gelbe Federn", 239:"Nasenloch"]
end
on mousewithin
me
mymemberpoint = sprite(me.spritenum).mapStageToMember(the
mouseloc)
if voidP(mymemberpoint) then return
mycolorref = mymapmember.getpixel(mymemberpoint[1],Â
mymemberpoint[2])
-- Anzeige Specials
if specialslist.getaprop(mycolorref) <> VOID then
put ¬ specialslist.getaprop(mycolorref) into
member("anzeige")
else put " " into member("anzeige")
end
|


 |
|
|
Dieses Skript zeigt im
Textdarsteller "anzeige" den Text an, der in der specialsList den
einzelnen Farbwerten zugeordnet ist. Entscheidend ist die Verwendung
der undokumentierten Funktion getpixel(), die folgende Syntax hat:
member(memref).getpixel(punkt_x,punkt_y)
--
oder
getpixel(member(memref), punkt_x, punkt_y)
Die Umrechnung der Mauskoordinaten
(the mouseloc) in Darstellerkoordninaten übernimmt die Funktion
mapStageToMember; in umgekehrter Richtung geht es mit mapMemberToStage.
Wie Sie in der Abbildung sehen, sind mit diesem Verfahren sehr feine
Hotspot-Strukturen möglich: jedes einzelne Pixel kann aktiv
sein. Da es sich allerdings um undokumentiertes Lingo handelt, sollten
Sie sich nicht darauf verlassen, daß es in späteren Director-Versionen
verfügbar sein wird.
|


 |
|