HowTo:
Bis 256 Klickbereiche in einer Grafik (Director 8)
|
|
Home
Workshop-Seite
|
Hier
finden Sie Hinweise, wie Sie diese Technik auch schon in Director
7 einsetzen können.
Mit Imaging Lingo (neu
eingeführt in Director 8, vorher waren einzelne Befehle undokumentiert
bereits vorhanden) lassen sich Farbwerte eines Bitmapdarstellers
in RGB auslesen. Das bietet die Möglichkeit, eine am Bildschirm
unsichtbare "Clickmap" für Sprites 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 mehr als genug sein, und die Bearbeitung ist deutlich
einfacher...
Das benötigte Imaging-Lingo-Inventar
beschränkt sich auf die Funktion getpixel():
put member(m).image.getpixel(point(100,100))
-- paletteIndex( 17 )
put member(m).image.getpixel(point(100,100), #integer)
-- 17
put member(m).image.getpixel(point(100,100))
-- rgb( 248, 152, 0 )
put member(m).image.getpixel(point(100,100), #integer)
-- 32352 -- 16 Bit-Darsteller
-- -25600
-- 32 Bit-Darsteller; Bug?!
Hier sind die ersten
vier Zeilen typische Rückgabewerte für 8-Bit-Bilder, der
zweite Block wäre normal bei 32-Bit-Bildern. Anders als beim
in Director 7 verfügbaren getpixel() ist nun der Rückgabewert
ein normales Farbobjekt, es sei denn, Sie spezifizieren über
den optionalen Parameter #integer, daß Sie einen Integerwert
erhalten wollen.
|


 |
|
|
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
|


 |
|
|
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.
|


 |
|