Mehrere Movieclips "Draggen"

hhjjppww

Mitglied
Hallo,

Ich habe folgendes Problem:

Ich habe ungefaehr 48 Movieclips und die sollen alle gleichzeitig gedragged werden, wenn man die Leertaste betaetigt. Wenn man die Leertaste nicht gedrueckt haelt, soll man trotzdem auf alle Movieclips per onPress zugreifen koennen.

Also Problem1: startDrag funktioniert nur mit einem Movieclip.
Problem2: Wenn ich nun alle 28 Movieclips in ein Movieclip konvertiere funktinoert die onPress Funktion nicht mehr. Also
PHP:
mc1.mc2.onPress = function() {};
geht nicht.
Problem 3: Anstatt startDraf zu benutzen und die Koordinaten von allen Movieclips, mit denen der Maus gleichzusetzten (bzw. mit einer gewissen Differenz), verbraucht viel zu viele Ressourcen.

Also weil mein Scriptcode viel zu lang waere, ihn hier zu posten, erklaere ich mein Problem nochmals:

Ich habe einen Stadtplan. In diesem Statplan gibt es Strassen und Gebaeude. Alle Strassen sind 1 Movieclip, aber ich habe zusaetzlich noch 47 Gebaeude. Da der Stadtplan zu gross fuer das Ausgabefenster ist, kann man den Stadtplan verschieben, wenn man die Leertatse gedrueckt haelt. Laesst man diese los, soll man nicht mehr navigieren, aber auf jedes einzelne Gebaeude klicken koennen.

Hat jemand eine Idee, wie man doch geschickterweise mehrere Movieclips draggen kann oder auf "Children"-Movieclips per onPress zugreifen kann

Vielen Dank fuer die Hilfe.
 
So nun ist es doch noch halb 4 Uhr nachts geworden aber ich habe selber, eine halbwegs vernuenftige Loesung gefunden:

Nachdem ich nun doch noch nach einiger Zeit dieses engl. sprachige Tutorial gefunden habe: http://senocular.com/flash/tutorials/buttoncapturing/
habe ich mir jetzt was zusammengebastelt.

So wie ich das richtig verstanden habe, gibt es von Flash aus, keine Moeglichkeit, Parents und Children gleichzeitig mit ButtonEvents anzusprechen. Wenn man vorher also den Parent noch nicht angesprochen hat, wird zb. die onPress Funktion beim Children ausgefuehrt.
In meinem Beispiel ist das so:

Anstatt zu gucken, ob die Leertaste gedrueckt ist, und man den MovieClip "map" angeklcikt hat (welcher alle Gebaeude und Strassen-MovieClips enthaelt) muss man jetzt schauen, ob die Leertaste gedrueckt ist, und entweder eines der Gebaeude oder die Strasse (oder das Monument) gedrueckt wurden, und dann alle per MovieClip "map" draggen.

Dieses Thema ist sehr theoretisch, aber ich versuche gernen weiter fragen dazu zu beantworten, also soweit wie ich's selber verstanden habe ;) Aber die oben genannte Internet-Seite beschreibt dieses Problem wirklich GUT! Leider wird dieses Thema nur selten angesprochen, somit habe ich auch wirklich kein Deutsch-sprachiges Tutorial oder Forenbeitrag gefunden.

Der funktionierende Code:
PHP:
map.onEnterFrame = function() {
	
	map.building22.onPress = function() {
		trace("building22 was pressed.");
	}
	
	if(Key.isDown(Key.SPACE)) {			
		for(i=1;i<48;i++) {
			map["building" + i].onPress = function() {
				if(Key.isDown(Key.SPACE)) {			
					startDrag(_root.map,false,20,20,-1016.5,-905);
				}
			}
			map["building" + i].onRelease = function() {
				stopDrag();
			}
			map["building" + i].onReleaseOutside = function() {
				stopDrag();
			}
		}
			//
			map.street.onPress = function() {
				if(Key.isDown(Key.SPACE)) {			
					startDrag(_root.map,false,20,20,-1016.5,-905);
				}
			}
			map.street.onRelease = function() {
				stopDrag();
			}
			map.street.onReleaseOutside = function() {
				stopDrag();
			}
			//
			map.monument.onPress = function() {
				if(Key.isDown(Key.SPACE)) {			
					startDrag(_root.map,false,20,20,-1016.5,-905);
				}
			}
			map.monument.onRelease = function() {
				stopDrag();
			}
			map.monument.onReleaseOutside = function() {
				stopDrag();
			}
	} else {
		stopDrag();
	}
}
 
Hi,

alternativ könntest Du auch einen globalen Mouse-Listener erstellen (onMouseDown), bei dessen Aufruf die Kollision mit der gesamten Map per hitTest, und der Status der Space-Taste geprüft werden: Ist beides der Fall, kannst Du die Drag-Aktion starten und bei dem Aufruf von "onMouseUp" wieder löschen. Zusätzlich setzt Du beim Starten der Drag-Aktion ein globales Flag, welches die Ausführung der Klick-Ereignisse auf den untergeordneten Elementen unterdrückt.

Gruß
.
 
Hey,

koenntest du mir da eventuell ein kleines Script geben?
Denn vielleicht funktioniert folgendes Problem ja mit dem Listener!

Ich habe mir nun dieses Script zusammengebastelt:

PHP:
map.onEnterFrame = function() {
	
// GRUNDSTUECKS-BEFEHLE
	//map.estate1.onRollOver = function() {
		//trace("estate22 was pressed.");
	//}
//------------------------------------


	
// LEERTASTE
	if(Key.isDown(Key.SPACE)) {			
		for(i=1;i<48;i++) {
			map["estate" + i].onPress = function() {
				if(Key.isDown(Key.SPACE)) {			
					startDrag(_root.map,false,20,20,-1016.5,-905);
				}
			}
			map["estate" + i].onRelease = function() {
				stopDrag();
			}
			map["estate" + i].onReleaseOutside = function() {
				stopDrag();
			}
		}
			//
			map.street.onPress = function() {
				if(Key.isDown(Key.SPACE)) {			
					startDrag(_root.map,false,20,20,-1016.5,-905);
				}
			}
			map.street.onRelease = function() {
				stopDrag();
			}
			map.street.onReleaseOutside = function() {
				stopDrag();
			}
			//
			map.monument.onPress = function() {
				if(Key.isDown(Key.SPACE)) {			
					startDrag(_root.map,false,20,20,-1016.5,-905);
				}
			}
			map.monument.onRelease = function() {
				stopDrag();
			}
			map.monument.onReleaseOutside = function() {
				stopDrag();
			}
	} else {
		stopDrag();
		map.estate1.onRollOver = function() {
			trace("estate1 was touched.");
		}
	}
//------------------------------------
	
}

und ganz unten die:

PHP:
} else {
		stopDrag();
		map.estate1.onRollOver = function() {
			trace("estate1 was touched.");
		}
	}

RollOver funktion wird auch ausgefuehrt, obwohl die Leertaste gedrueckt ist. Ich moechte aber, dass wenn die Leertaste gedrueckt ist, weder onRollOver noch onPress Funktionen gehen.

Also: Das mit onPress geht, nur habe ich jetzt bloederweise das Problem, dass onRollOver auch ausgefuehrt wird, obwohl die Leertaste gedrueckt ist!

Geht das eventuell mit diesem Listener, oder habe ich nur irgendwie was dummes uebersehen?

Danke schonmal!
 
Zuletzt bearbeitet:
Hi,

im Anhang findest Du ein Beispiel.

Du könntest alternativ auch den Key-Listener dazu verwenden, eine onPress- und onRelease-Methode auf die gesamte Map zu setzen, die beim onKeyUp wieder entfernt wird. Damit würdest Du Dir den Mouse-Listener mitsamt dem hitTest sparen.

Gruß
.
 

Anhänge

Hallo,

Vielen herzlichen Dank fuer das Beispiel. Genau das habe ich gesucht.
Alleridngs hab ich es auch mit dem Mouse-Listener und dem HitTest gemacht.

Nun habe ich aber einweiter Problem entdeckt:

PHP:
for (i=1;i<48;i++) {

	map["estate" + i].onRollOver = function() {
		if (!dragmode) {
			map["textfield"+i]._alpha = 100;
		}
	}
}

Die Zeile innerhalb der IF-Bedingung funktioniert nicht. Aber warum?
Irgendwie funktioniert dort nur wenn man mit "this" arbeitet. Aber das Textfeld liegt nicht innerhalb der "ESTATE"-MovieClips, sondern auch innerhalb des "MAP"-MovieClips.

Also die Struktur:

MAP
-> ESTATE
-> TEXTFIELD

Wie kann ich auf das Textfeld zugreifen und dessen Alpha auf 100 setzen, wenn man darueber rollt?

Es funktioniert mit dieser Struktur:

MAP
-> ESTATE -> TEXTFIELD

Also wenn Textfield ein MovieClip in dem MovieClip Estate ist.

PHP:
for (i=1;i<48;i++) {

	map["estate" + i].onRollOver = function() {
		if (!dragmode) {
			this.textfield._alpha = 100;
		}
	}
}

Aber ich moechte das nicht so, sondern wie das erste Beispiel. Geht das?

Danke.
 
Hi,

der Fehler entsteht, weil zum Zeitpunkt des Ausführens der onRollOver-Methode die Variable "i" nicht mehr gültig ist bzw. auf ihrem Endwert (am Ende der Schleife) steht.

Du solltest jedem "estate"-Objekt eine Referenz auf das dazugehörige Textfeld mitgeben:
Code:
for (i=1;i<48;i++) {

    map["estate" + i].tf = map["textfield" + i];

    map["estate" + i].onRollOver = function() {
        if (!dragmode) {
            this.tf._alpha = 100;
        }
    }
}

Gruß
.
 
Zurück