Adobe Flash Mouseabfragen & co

sebo

sebo

Mitglied
Thread Starter
Dabei seit
29.04.2004
Beiträge
78
Reaktionspunkte
0
hallo,

ich möchte gerne einen movieclip durch abfrage der mausposition steuern, d.h. es sollen mehrere sensitive bereiche auf der bühne entstehen ( wichtig: keine movieclips!) bei deren rollover in einem auf der bühne platziertem movieclip in einen frame gesprungen wird. vergleichbar mit dem bärenspiel auf
www.bearskinrug.co.uk
sollte wenn möglich ein einfacher code sein. weiß jemand wie's geht?

seb
 
Re: movieclip steuerung mit mausposition

Hi.
Original geschrieben von sebo
ich möchte gerne einen movieclip durch abfrage der mausposition steuern, d.h. es sollen mehrere sensitive bereiche auf der bühne entstehen ( wichtig: keine movieclips!)
Scherzkeks ;) Was soll denn sonst „sensitiv“ sein? Normalerweise nimmt man dafür Movieclipinstanzen mit hitTest() Kollisionsabfrage.
Aber du kannst ja auch blinde Buttoninstanzen verwenden, das sind oberflächlich gesehen keine MCs ;)

Original geschrieben von sebo

sollte wenn möglich ein einfacher code sein. weiß jemand wie's geht?

Schau mal hier. Dort kannst du dir eine .zip herunterladen, die ich gebastelt habe, die nach dem gleichen Prinzip funktioniert. Dort sind 4(?) Bereiche auf der Bühne, die onRollOver etwas ausführen.

Schau einfach mal hinein.

Liebe Grüße

Yves
 
danke erstmal, aber:
was ist denn eine blinde buttoninstanz?
in deiner .fla sind ja auch lauter movieclips bzw buttons. mit sensitivem bereich mein ich, daß im AS der maus gesagt wird, daß auf einer z.b. 400x300px bühne der bereich 0, 0, 30, 30 (also oben links) sensitiv ist, also bei rollover dieses bereichs soll was im movieclip passieren. das script von dir durchschau ich leider nicht...

seb
 
Original geschrieben von sebo

was ist denn eine blinde buttoninstanz?

Das ist ein Symbol. Es gibt doch Movieclips, Buttons, Grafiken.

Eine blinde Buttoninstanz ist eine Instanz des Symbols „Button“, welcher durch den aktiven Bereich definiert und somit quasi unsichtbar ist.

Buttons benutze ich allerdings gar nicht mehr, sondern direkt Movieclips mit entsprechendem Handler und einer Funktion. Das ist viel viel flexibler.

movieclip.onRelease=function(){//do this, do that}

Original geschrieben von sebo

in deiner .fla sind ja auch lauter movieclips bzw buttons.
Ein Movieclip ist eigentlich kein Button. Das was dort das ganze steuert, sind einfach 4 blinde Buttoninstanzen mit einem simplen gotoAndStop() im onRollOver Handler. Das ist dort extra so „billig“ wie möglich gemacht, damit jeder Anfänger es versteht. Also kein hitTest(); keine Movieclip Buttonhandler, keine Mouseabfragen in einem onEnterFrame()…
Original geschrieben von sebo

mit sensitivem bereich mein ich, daß im AS der maus gesagt wird, daß auf einer z.b. 400x300px bühne der bereich 0, 0, 30, 30 (also oben links) sensitiv ist, also bei rollover dieses bereichs soll was im movieclip passieren.

0,0,30,30 bedeutet x==0, y==0, width==30, height==30, oder? Das würde dann bedeuten, das ein 30*30 großer Ausschnitt auf 0,0 dadurch definiert ist.

Nun, in Flash gibt es aber nicht das Prinzip, wie es bei Imagemaps angewandt wird.

Du kannst dir, wenn du es so machen willst, einen großen Movieclip mit 400*300 erstellen und eine Instanz auf die Bühne legen, die die gleiche Farbe hat, wie der Hintergrund hätte. Oder du machst das ganze einfach transparent. Und dann kannst du in einem onEnterFrame Handler mittels hitTest() abfragen, ob sich die Mouse an der von dir definierten Stelle befindet oder nicht. hitTest hat einen boolschen Rückgabewert, mit dem kannst du dann ja arbeiten. Und wenn die sensitiven Bereiche wechseln, kannst du dir das ganze auch in eine Funktion oder direkt in einen Prototype schreiben und die variierenden Werte als Parameter übergeben.

Falls aber nur ein bestimmter Bereich sensitiv ist und auch nicht variiert, sowie es bei dir wahrscheinlich sein wird, dann benutz doch einfach transparente MC Instanzen, die du an die Stelle legst wo es sensitiv sein soll und dann halt einen hitTest() auf die Instanz in einem onEnterFrame anlegen.
Original geschrieben von sebo

das script von dir durchschau ich leider nicht...
Wenn du das aus der .fla nicht verstehst, was ja nur ein simples gotoAndStop() ist, dann vergiß ebenfalls das ganze mit hitTest und lege dir einfach an die sensitiven Stelle eben diese blinden Buttoninstanzen und definiere die Aktion in deren onRollOver Handler.

Liebe Grüße

Yves
 
Zuletzt bearbeitet von einem Moderator:
hallo yves,

das zeug aus der .fla hab ich schon verstanden, ich meinte vielmehr das script, welches du als antwort auf die 3d frage gepostet hast ;-)
mein bemühen movieclips zu vermeiden rührt vielmehr daher, daß ich, wenn ich mehrere verschiedene movieclips auf meiner bühne verwende, unter anderem welche, die sich verschieben lassen, dann laufe ich gefahr, daß sich irgendwann einzelne mcs überdecken, und daher das steuern des einen movieclips nicht mehr funktioniert, da die sensitive fläche verdeckt ist. also die sache mit dem hittest ist schon ok (versteh ich auch, kann ich nur noch nicht so gut selber schreiben...)

gruß,
seb
 
Original geschrieben von sebo
ich meinte vielmehr das script, welches du als antwort auf die 3d frage gepostet hast
Das ist für dein Anliegen ja auch total uninteressant… das erste ist eine Klasse mit trigonometrischen Funktionen gewesen… und weiter unten ein Beispiel wie man via PHP aus MySQL Daten in Flash mit einem LoadVars Objekt auslesen kann.


Original geschrieben von sebo

also die sache mit dem hittest ist schon ok (versteh ich auch, kann ich nur noch nicht so gut selber schreiben...)

Versuch das mal so… musst du dir natürlich anpassen.
PHP:
//actionscript 1

var sensitive=_root.attachMovie('sensitive_mc','sensitive_mc',1);
sensitive._width=30;
sensitive._height=30;
sensitive._x=0;
sensitive._y=0;
//sensitive._alpha=0;

this.onEnterFrame=function()
    {
    if(_root.sensitive_mc.hitTest(_root._xmouse, _root._ymouse, true))
        {
        trace('true');
        }
    else
        {
        trace('false');
        }
    }

Ich instanziere hier aus der Library einen Movieclip und lege den auf die Koordinaten 0 0, nachdem ich diese quadratisch auf 30px Größe gebracht habe. Damit man das besser erkennen kann, habe ich den MC schwarz gefärbt. Wenn du das unsichtbar haben möchtest, dann einfach im Script oben //sensitive._alpha=0; auskommentieren.

onEnterFrame wird eine Funktion ausgeführt, die prüft, ob sich die Maus exakt auf diesem Feld befindet. Beim Testen der SWF siehst du dann ja die Traceergebnisse im OutputWindow. Hier musst du dann natürlich deine gewünschten Aktionen hineinschreiben.

Fla liegt anbei.

Ich hoffe dein Problem ist gelöst ;)

Liebe Grüße

Yves
 
hallo yves,

vielen dank für deine antwort, jedoch kriege ich es irgendwie nicht gebacken meine function richtig zuzuordnen. ich hab mal meine .fla angefügt.

gruß,
seb
 
Hi Sebo,

ich schaue mal in deine Fla. Bin zurzeit nicht online, da Upgradearbeiten bei uns im Netzwerk durchgeführt werden.

Wenn ich dir die korrigierte Fla bis Ende Juni nicht gepostet habe, erinnere mich bitte nocheinmal via PN daran.

Ansonsten gerne auch telefonisch Support. Ich schicke dir meine Telefonnummer per PN.



Liebe Grüße

Yves
 
Die Function wird onEnterFrame ausgeführt. Das heisst, das sie im Takt der Framerate aufgerufen wird. Dort wo in der bedingten Anweisung //trace('true') definiert ist, wird also immer im Frametakt diese Anweisung ausgeführt, sofern sich die Mouse über dem Kollisionsobjekt 'sensitive_mc' befindet.

Bei dir ist es nun so, das du nicht mit einem aktiven Feld 3 verschiedene Zustände ansprechen kannst.

Es geht also nicht ohne weiteres mittels einer einfachen boolschen Bedingung 3 verschiedene (bzw. 4 oder 6, je nach Auslegungssache) zu definieren.


Ich habe es jetzt so korrigiert, das im Falle einer Kollision der Movieclip 'ding' abgespielt (play();) wird. Konkrekt sieht das so aus, das solange das 'ding' die Farben wechselt (mittels Durchlaufens seiner Zeitleiste), bis die Mouse vom Kollisionsobjekt entfernt wird. 'ding' wird dann beim nächsten stop(); seiner Zeitleiste anhalten.

Du kannst den stop(); natürlich auch in die bedingte Anweisung mit dem hitTest(); schreiben. Macht aber hier wenig Sinn.

Wenn du es nun schaffen möchtest, mittels dieser einfachen bedingten Anweisung die 3 Farben von 'ding' separat zu erreichen, musst du dir entweder 3 sensitive Flächen bauen und dort dann gotoAndStop(5), …(10), …(15) eintragen und entsprechend den HitTest() auf eine Abfrage alles 3 Kollisionsobjekte erweitern.

Nacheinander kannst du die Zustände mittels eines geschickt überlegten Systems von Steuervariablen auch mit nur einer sensitiven Fläche und deren Kollision mit der Mouse erreichen.
Aber da überlege mal selbst, da es auch dein Job ist ;) :D


Liebe Grüße

Yves
 
Zurück
Oben Unten