Mit Drag 'n Drop Elemente anordnen (FlashMX)

Fey

Erfahrenes Mitglied
Hallo zusammen,

vielleicht seht Ihr es schon an der Überschrift, dass ich nicht so richtig weiß, wie ich es ausdrücken soll.

Ich kann ja, wenn ich Elemente mit Drag 'n Drop verschieben und eine Stelle definieren, an der diese Elemente hingesetzt werden sollen. Wenn nicht, springen sie wieder zurück an die Ursprungsstelle. Das hab ich ja schon alles hinbekommen.

Jetzt soll ich das aber mal so machen, dass die Elemente wild im Raum verteilt sind und in einer gewissen Reihenfolge angeordnet werden sollen. Dabei soll es keine festen Plätze geben sondern einfach nur die Reihenfolge eingehalten werden.

Wo fang ich da jetzt an? Ich weiß noch nicht einmal, nach was ich da suchen muss...bin da total aufgeschmissen. Kann mir einer von Euch vielleicht helfen? Sollte in AS umgesetzt werden, von daher bräuchte ich einen Profi.

Liebe Grüße und ein dickes Danke im vorraus,
Feyiama
 
Ok. Nur mal als Nachfrage, ob ich es richtig verstanden habe. Du willst einzelne Objekte haben. Davon zeihst du eins irgendwo hin. Und dann sollen die anderen Objekte, wenn man mit ihnen am Ersten vorbeifährt, dort angeordnet werden.
Also so wie in WinAmp?
Stimmt das so weit?
 
*kopfschüttel*

nicht automatisch...

Also...ich habe ein Blockheizkraftwerk. Das hat ja bestimmte Stationen, welche der Strom bzw. die Wärme durchlaufen soll. Und diese soll der User jetzt hintereinander anordnen können auf der gesamten Fläche. Was ich sicherstellen muss ist, dass der User eine Fehlermeldung kriegt wenn der Transformator rechts vom Generator liegt anstatt, wie im Beispiel, links. Links wäre somit richtig und der Transformator würde an der Stelle liegenbleiben. Und so weiter...halt mit allen Elementen und Stationen dieses Kraftwerkes.

Ich hoffe, dass war ein wenig verständlicher. :)

Liebe Grüße,
Feyiama
 
hmmis jetzt zwar eher ne noob antwort und ich weis nicht wie die objekte vorher angeordnet sind, aber wenn hinterher alles in einer reihe sein soll, wiso kann man dann nicht einfach beim "droppen" eines objektes das zB. rechts von einem andern liegen soll über prüfen dass der _x - wert auch größer ist als der von dem neben dem es liegen soll. und wenn es nicht so ist kommt halt die fehleranzeige...

*sancho*
 
du solltest dem benutzer schon dazu "zwingen" das er ein bestimmte reihenfolge einhalten soll, sprich links ist der anfang oder der transformator muß ganz links sein. wenn man auch noch anfängt das ganze diagonal anordnen zu können wird die sache ziemlich komplex.
aber sofern man sich auf eine horizontale von-links-nach-rechts-anordnung einigt kann man das so machen wie sancho meinte:
angenommen man hat drei objekte: objektA, objektB und objektC die der einfachheit halber auch in der reihenfolge angeordnet werden sollen. sprich a links von b und b links von c.
weiterhin angenommen die objekte sind alle 200 pixel breit, dann kann man so prüfen ob sie richtig liegen:
PHP:
xposiA = _root.objektA._x;
xposiB = _root.objektB._x;
xposiC = _root.objektC._x;
if ((xposiA < (xposiB-200)) and (xposiB < (xposiC-200)){
trace ("alle liegen richtig");
}
das ganze sollte sinnvolerweise eine onenterframe-aktion werden oder einem knopf zugewiesen werden.
die -200 hängt davon ab wo er 0-punkt deiner mcs liegt. MX setzt ihn, wenn man das symbol mit f8 erstellt, gerne in die mitte des mcs, dann würde -100 reichen. es geht nur darum das es erst richtig ist wenn die elemente nebeneinander liegen und sich nicht mehr überlappen.
wenn man die -200 weglassen würde könnte man die elemente auch bedingt diagonal anordnen, sofern objektA ganz links ist, aber ich würde an deiner stelle eher mehr forgaben geben, da man ansonsten auch die objekte auf die falsche art vertikal anordnen kann und durch verschiedene "milli"-pixel-werte wird das ganze dann als horizontal richtig eingestuft.
 
Hi kuat,

so ungefähr verstehe ich, was Du meinst. Die Umsetzung habe ich noch nicht so ganz kapiert.

Es liegen allerdings einige Teile die in der vertikalen richtig angeordnet werden müssen.

Gestern habe ich es so probiert:

Code:
on (release) {
stopDrag();
if (_root._x.strommast<_root._x.generator &&
_root._x.strommast<_root._x.transformator) {
var_strommast = true;)
}
}

Allerdings habe ich einen ganz groben Denkfehler eingebaut, weil ich jetzt die Abfrage mache, wenn das Objekt losgelassen wird. Aber damit ist ja nicht sichergestellt, dass die anderen Objekte auch schon da liegen, wo sie hinsollen.
Also muss ich das ganze jetzt auf einen unsichtbaren MC legen? Oder?

Liebe Grüße,
Feyiama
 
Also ich würde die ganze "Arbeitsfläche" in ein grobes Raster unterteilen und den Platz so bemessen, daß der richtige Aufbau genau und nur auf einer bestimmten Position reinpaßt. Dann kannst du nämlich abfragen ob die jeweiligen Elemente genau in den richtigen "Planquadraten" liegen, und mußt dich nicht mit ungefähren Positionen rumschlagen. Wenn du dann die einzelnen Elemente z.B. mit Rohren oder Kabeln ausstattest, die bei richtiger Positionierung aneinander passen, kannst du auch davon ausgehen daß die Leute die Teile aneinander setzen und nicht einfach in den Raum werfen.

Für die Korrektur könntest du z.B. eine Glühbirne nehmen die ein Movieclip ist der mit einer onClipEvent(enterFrame)-Abfrage die Positionen der einzelnen Elemente abfragt.
 
Hi Kapro,

was glaubst Du, wie gerne ich diese Möglichkeit nehmen würde. Darf ich aber nicht. Anordnung von oben. :(

Die Abfrage habe ich hinterher auf einem Button. Aber irgendwie funktioniert der ganze Sch*** nicht. :(

Ich habe das jetzt folgendermaßen versucht:

Unsichtbarer MovieClip. Auf diesem Movieclip lag folgendes:

Code:
onClipEvent (enterFrame) {
	//Strommast
	if (_root.strommast._x<_root.transformator._x &&
		_root.strommast._x<_root.generator._x &&
		_root.strommast._x<_root.motor._x &&
		_root.strommast._x<_root.kamin._x &&
....

Also, es gibt insgesamt 12 If-Abfragen, weil ich zwölf Objekte habe. Die sind untereinander. Bei jeder IF-Abfrage frage ich die Position von den Objekte ab und sage ihm am Schluß

Code:
var_strommast = true;

Natürlich für jedes Objekt einen anderen Variablen-Namen.

Über einen Button frage ich mittels trace ab, ob er das denn "schluckt". Also:

Code:
on (release) {
	trace(var_strommast == true);
	trace(var_transformator == true);
	trace(var_generator == true);
	trace(var_kamin == true);
	trace(var_abgasleitung == true);
	trace(var_waermetauscher == true);
	trace(var_erdgasleitung == true);
	trace(var_spitzenkessel == true);
	trace(var_speicher == true);
	trace(var_waermeleitung == true);
	trace(var_wasserleitung == true);
	trace(var_heizung == true);
}

Und er gibt mir immer false aus. Ich ordne die Objekte alle an und überprüfe mit trace und immer ist es falsch. Ich werde hier bald wahnsinnig. :(

Wo ist mein Denkfehler?

Liebe Grüße,
Feyiama
 
Hm, also zuerst einmal: trace(var_dingens == true) braucht es nicht unbedingt, trace(var_dingens) reicht völlig.

Des weiteren glaube ich, du machst dir da etwas zuviel arbeit, da ja nur eine einzige aller möglichen Kombinationen die richtige ist. Deswegen brauchst du so wie ich das sehe gar nicht die Position jedes Elements mit jedem anderen zu vergleichen, das wird nur unübersichtlich und ich weiß nicht, wieviele Abfragen auf einmal Flash verarbeitet.

Den Aufbau unten kann man relativ einfach beschreiben, und damit auch abfragen.

In den Actions des ersten Frames würde ich einen Satz von Variablen für jedes Element bestimmen:

Code:
var A_flag = 0;
var B_flag = 0;
var C_flag = 0;
var D_flag = 0;
var E_flag = 0;
var F_flag = 0;
var G_flag = 0;

Damit wird am Anfang eine Flag (Statusabfrage) für jedes Element definiert, diese werden wenn sie denn richtig liegen jeweils auf 1 gesetzt.

B ist rechts von A => B._x > A._x
C ist rechts von B => C._x > B._x
D ist rechts von C => D._x > C._x
E ist unterhalb von C und zwischen B und D => E._y > C._y && E._x > B._x && E._x < D._x
F ist unterhalb von E und auch zwischen B und D => F._y > E._y && F._x > B._x && F._x < D._x
G ist rechts von F und unterhalb von E => G._x > F._x && G._y > E._y

Mehr braucht es nicht, da es ja ausreicht wenn eines der Elemente nicht stimmt, um die ganze Reihenfolge ungültig zu machen.

Dementsprechend fällt dann auch der Code etwas simpler aus:

Code:
if (B._x > A._x) B_flag = 1; else B_flag = 0;
if (C._x > B._x) C_flag = 1; else C_flag = 0;
if (D._x > C._x) D_flag = 1; else D_flag = 0;
if (E._y > C._y && E._x > B._x && E._x < D.x) E_flag = 1; else E_flag = 0;
if (F._y > E._y && F._x > B._x && F._x < D.x) F_flag = 1; else F_flag = 0;
if (G._x > F._x && G._y > E._y) G_flag = 1; else G_flag = 0;

Die Zeilen kannst du in die on(release) der jeweiligen Elemente reinpacken, da sie ja nur abgefragt zu werden brauchen wenn der User das Teil losläßt.
Jetzt brauchst du den Movieclip der die Sache checken soll nur noch die flags zusammenrechnen lassen und das Ergebnis abfragen:

Code:
onClipEvent(enterFrame) {
Summe = A_flag + B_flag + C_flag + D_flag + E_flag + F_flag + G_flag;
if (Summe == 6) trace ("Juhu"); //da wir sechs if-abfragen haben muß die Summe 6 sein.
}

So würde ich mir das denken. Ich hoffe das hilft ein bißchen.

/Kapro
 

Anhänge

  • aufbau.gif
    aufbau.gif
    2,8 KB · Aufrufe: 69
Hi zusammen,

hab meine Variante zum laufen gekriegt. War eigentlich nur mal wieder ein dumm-dusseliger Denkfehler von meiner Seite. Habe vergessen, bei der Variablen-Prüfung den Pfad mit anzugeben, wo die blöde Variable liegt.

Dank Euch nochmal für Eure Hilfe.

Liebe Grüße,
Feyiama
 

Neue Beiträge

Zurück