Zurück   Flashforum > Flash > ActionScript > ActionScript 1

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 21-07-2003, 17:23   #1 (permalink)
Neuer User
 
Registriert seit: Feb 2002
Beiträge: 16
Menü-Programmiering elegant?

Hallo alle zusammen,

ich sitze hier seit geraumer Zeit und schuster mir ein Menü zusammen. Leider merke ich, dass, je weiter ich komme, desto unübersichtlicher wird das ganze. Und jetzt denke ich, es muss doch eine Möglichkeit geben, genau das, was ich vorhabe auch elegant Flash5-kompatibel umzusetzen.

Momentan bewegt sich bei MouseOver alles so, wie ichs gern hätte. Im Endeffekt sollen natürlich bei Click die jeweiligen Unterpunkte stehen bleiben etc. Aber ich will grad gar nicht weitermachen, bevor ich nicht wenigstens einen neuen Ansatz oder Gedankengang im Kopf habe, wie ich diese Problem effektiver lösen könnte.

Vielen Dank im Voraus Euch allen,
Karsten
Angehängte Dateien
Dateityp: zip nav_test_fl5.zip (10,0 KB, 53x aufgerufen)
derkarsten ist offline   Mit Zitat antworten
Alt 21-07-2003, 18:26   #2 (permalink)
Farbe ist Luxus
 
Benutzerbild von ludabruda
 
Registriert seit: May 2003
Ort: Köln
Beiträge: 2.405
hallo karsten.

ja, funktinieren tuts prima, allerdings kann man da schon noch ein paar Dinge verändern, um es vor allem etwas flexibler zu gestalten (und nicht so performance-lastig).

Deine einzelnen Menus sehen ja prinzipiell gleich aus, somit ließen sie sich auch gut skripten.
Die Aufklapp-Funktion, die jetzt im onEnterFrame steht, kann genausogut in einen Frameloop, der nur dann aufgerufen wird, wenn er gebraucht wird (direkt im Button). Die onEnterFrames sind zwar momentan nicht sonderlich belastend fürs System, aber dafür, dass eigentlich gar nichts passiert, sind 2-4 Prozent System-Auslastung schon zu viel.

Mach dir am besten ein Array für das HauptMenu. Für jeden dieser Array-Einträge erzeugst du weitere Arrays für die Untermenus.

Erstellen kannst du dein Menu dann mittels duplicateMovieClip(); dafür brauchst du die Hauptstruktur deines Menus nur einmal auf der Bühne haben.

Auch die Abfragen auf den einzelnen MCs kannst du prima mit vorher an den duplizierten MC übergebenen Variablen lösen.

Schau vielleicht mal bei den Tutorials nach Menus, da müsste sich einiges finden, was dir ggf. weiterhilft.

Grüße
Sascha
__________________
12:15, press return
ludabruda ist offline   Mit Zitat antworten
Alt 22-07-2003, 11:25   #3 (permalink)
Neuer User
 
Registriert seit: Feb 2002
Beiträge: 16
Hallo Sascha,

vielen Dank für die Tipps... ich hab mich mal daran versucht... was mir fehlt ist grad immer noch der logische Ansatz der Filmstruktur. Ich weiss nicht recht, wie ich die Movieclips und Buttons bauen und verschachteln muss, damit das so funktioniert wie es soll. Wo setz ich den Frameloop? oh, oh... hab das Gefühl, mein Hirn scheut heute alles über Normalnull

Und: die Navigation soll nachher HTML-Dateien in nem anderen Frame und einen Movieclip in der Navigation an sich steuern... kann ich sowas einfach dynamisch übergeben?

Wie würdest Du das Menü-Array aufbauen? Nur ein mehrdimensionales? Gibts in Actionsscript sowas schönes wie "foreach" in php?

Vielen Dank!
Karsten
derkarsten ist offline   Mit Zitat antworten
Alt 22-07-2003, 14:06   #4 (permalink)
Klugscheisser
 
Registriert seit: Jun 2001
Ort: Düsseldorf
Beiträge: 1.354
Es gibt in Flash5 keine echten mehrdimensionalen Arrays und foreach gibt´s auch nicht, nicht mal Array.walk

Das Einzige, was geht ist, dass Du den Inhalt von Arrayelementen aus anderen Arrays definierst, also

variable = new Array(x,y,z);
topArray = new Array();

topArray[1] = variable;

Geändert von T.Decay (22-07-2003 um 14:08 Uhr)
T.Decay ist offline   Mit Zitat antworten
Alt 22-07-2003, 14:21   #5 (permalink)
Farbe ist Luxus
 
Benutzerbild von ludabruda
 
Registriert seit: May 2003
Ort: Köln
Beiträge: 2.405
Hallo,

@T.Decay: was meinst du denn mit "echten" mehrdimensionalen Arrays?

Du kannst deine Arrays wie folgt aufbauen:

ActionScript:
  1. ar = new Array();
  2. ar[0] = new Array(1,2,3,4,5);
  3. ar[1] = new Array(6,7,8,9,0);
  4.  
  5.  
  6. for(i in ar) {
  7.     for(j in ar[i]) {
  8.         trace(ar[i][j]);
  9.     }
  10. }

Das for(i in ar) entspricht in etwa dem foreach. Das geht natürlich genauso mit dem "normalen" for(i=0;i<ar.length;i++)...

Grüße
Sascha
__________________
12:15, press return
ludabruda ist offline   Mit Zitat antworten
Alt 22-07-2003, 14:43   #6 (permalink)
Klugscheisser
 
Registriert seit: Jun 2001
Ort: Düsseldorf
Beiträge: 1.354
for in und for gibt´s auch in php aber eben auch foreach

und mit den "echten" Arrays meine ich, dass Du für eine Anwendung auf jedes Element einzeln, wie Du das gerade vorgeführt hast, vorher wissen musst, aus wie vielen Dimensionen dein Array besteht, weil ja jede davon ihre eigene for-Schleife braucht. Man könnte jetzt noch Abfragen reinklotzen, ob da jeweils ein Array drunterliegt, was aber wiederum nur geht, wenn man absehen kann, wie jenes Array ggf. heissen würde.
Es ist nach meinem bisherigen Horizont nicht möglich, ein Array.walk zu simulieren, und auch wenn man verschachtelte for-Schleifen als ausreichend befindet, ist es eben immer noch simuliert und nicht "echt".

Ist aber in diesem Fall schon ein bisschen Haarspalterei, das gebe ich zu

Edit: Geht auch noch schlanker:
ActionScript:
  1. ar = new Array(new Array(1,2,3,4,5),new Array(6,7,8,9,0));


[edit2]join(); trace(); ...usw. funktionieren allerdings tatsächlich wie bei "Echten"[/edit2]

Geändert von T.Decay (22-07-2003 um 14:52 Uhr)
T.Decay ist offline   Mit Zitat antworten
Alt 22-07-2003, 15:53   #7 (permalink)
Farbe ist Luxus
 
Benutzerbild von ludabruda
 
Registriert seit: May 2003
Ort: Köln
Beiträge: 2.405
H,

prinzipiell ginge es mit einer Rekursion, in der der Typ des Parameters abgefragt wird. Es lässt sich zwar nicht "array" als Typ differenzieren, aber "object" sollte hier reichen:

ActionScript:
  1. function rekursion (a,b) {
  2.         for(var i=0;i<a.length;i++) {
  3.             if(typeof(a[i]) == "object") {
  4.                 rekursion(a[i],i);
  5.             } else {
  6.                 trace(b + ":" + a[i]);
  7.             }
  8.         }
  9.  
  10. }
  11.  
  12. rekursion(ar,"");

Hierbei ist es egal, wie tief deine Arrays sind.

Aber nochmal zurück zum eigentlich Problem: um erstmal ein bisschen Struktur in die Sache zu bekommen, ist es egal, ob jeder beliebige Baum damit abbildbar ist. Fang erstmal mit zweidimensionalen Strukturen an, falls nötig kann man es danach auch noch erweitern.

Grüße
Sascha

PS: ob die Ausgabe so 100-Pro ist, weiß ich auch nicht, prinzipiell gehts aber
__________________
12:15, press return
ludabruda ist offline   Mit Zitat antworten
Alt 23-07-2003, 09:28   #8 (permalink)
Neuer User
 
Registriert seit: Feb 2002
Beiträge: 16
Hallo Ihr alle,

vielen Dank schonmal für die Hilfe. Ich hab das jetzt mal umgebaut und dupliziere jetzt den MainButton MC folgendermassen:

ActionScript:
  1. mainPositions = new Array(0,91,182,273);
  2. menu = new Array("Main1","Main2","Main3","Main4");
  3.  
  4. i = 0;
  5. j = 0;
  6. for (i in menu) {
  7.     trace(i);
  8.     duplicateMovieClip (mainButton, "mainButton"+i, i);
  9.     setProperty ("mainButton"+i, _x, _root.mainPositions[i]);
  10.     i++;
  11. }

Das funktioniert auch soweit alles. Die Bewegungsfunktionen hab ich aus den onEnterFrames rausgenommen und in zwei Frameloops geschrieben. Auch das geht wunderbar.

Jetzt aber Folgendes (Ich glaube, man mekt, dass ich schon seit nem guten Jahr nix mehr in Flash gemacht hab...):

Wie kann ich in den duplizierten MCs direkt ne Variable setzen? Sinngemäß in der Art:

ActionScript:
  1. setVariable ("mainButton"+i, dynTxt, _root.menu[i]);

Das geht natürlicht nicht, aber ich hoffe, Ihr versteht, was ich meine

Vielen Dank nochmal,
Karsten
derkarsten ist offline   Mit Zitat antworten
Alt 23-07-2003, 10:01   #9 (permalink)
Klugscheisser
 
Registriert seit: Jun 2001
Ort: Düsseldorf
Beiträge: 1.354
_root[namevomMC].EigenschaftoderVariable=Wert;

Geändert von T.Decay (23-07-2003 um 10:02 Uhr)
T.Decay ist offline   Mit Zitat antworten
Alt 23-07-2003, 10:09   #10 (permalink)
Farbe ist Luxus
 
Benutzerbild von ludabruda
 
Registriert seit: May 2003
Ort: Köln
Beiträge: 2.405
das geht z.B. so:
eval("mainButton"+i).dynTxt = _root.menu[i];

Grüße
Sascha
__________________
12:15, press return
ludabruda ist offline   Mit Zitat antworten
Alt 23-07-2003, 12:29   #11 (permalink)
Neuer User
 
Registriert seit: Feb 2002
Beiträge: 16
Danke!

damit bin ich schon wieder ein wenig weiter gekommen...
Jetzt häng ich aber noch an was: Folgendes sollte eigentlich mein Menü auf den Bildschirm zaubern:

ActionScript:
  1. menu = new Array("Main1","Main2","Main3","Main4","Main5","Main6");
  2. submenu = new Array();
  3. submenu[0] = new Array("sub1_1","sub1_2","sub1_3");
  4. submenu[1] = new Array("sub2_1","sub2_2","sub2_3");
  5. submenu[2] = new Array("sub3_1","sub3_2");
  6. submenu[3] = new Array("sub4_1","sub4_2","sub4_3","sub4_4");
  7. submenu[4] = new Array("sub5_1","sub5_2","sub5_5");
  8. submenu[5] = new Array("sub6_1","sub6_2");
  9.  
  10.  
  11. i = 0;
  12. j = 0;
  13.  
  14. for (i in menu) {
  15.     duplicateMovieClip (mainButton, "mainButton"+i, i);
  16.     setProperty ("mainButton"+i, _x, _root.mainPositions[i]);
  17.     eval("mainButton"+i).dynTxtTxt = menu[i];
  18.     for (j in submenu[i]) {
  19.         trace(i);
  20.         trace(submenu[i]);
  21. //    duplicateMovieClip (subButton, "subButton"+i+"_"+j, i);
  22. //    setProperty ("subButton"+i+"_"+j, _x, _root.mainPositions[i]);
  23. //    eval("subButton"+j+"_"+i).dynTxt = submenu[i][j];
  24.         j++;
  25.     }
  26.     j = 0;
  27.     i++;
  28. }

bzw. momentan nur die traces ausgeben.. Seltsamerweise gibt o.g. Script die hier aus:

ActionScript:
  1. 5
  2. sub6_1,sub6_2
  3. 5
  4. sub6_1,sub6_2
  5. 4
  6. sub5_1,sub5_2,sub5_5
  7. 4
  8. sub5_1,sub5_2,sub5_5
  9. 4
  10. sub5_1,sub5_2,sub5_5
  11. 3
  12. sub4_1,sub4_2,sub4_3,sub4_4
  13. 3
  14. sub4_1,sub4_2,sub4_3,sub4_4
  15. 3
  16. sub4_1,sub4_2,sub4_3,sub4_4
  17. 3
  18. sub4_1,sub4_2,sub4_3,sub4_4
  19. 2
  20. sub3_1,sub3_2
  21. 2
  22. sub3_1,sub3_2
  23. 1
  24. sub2_1,sub2_2,sub2_3
  25. 1
  26. sub2_1,sub2_2,sub2_3
  27. 1
  28. sub2_1,sub2_2,sub2_3
  29. 0
  30. sub1_1,sub1_2,sub1_3
  31. 0
  32. sub1_1,sub1_2,sub1_3
  33. 0
  34. sub1_1,sub1_2,sub1_3

also, als ober er die "zweite Array-Ebene" gar nicht also Array, sondern als stinknormalen String wahrnimmt... Denkfehler meinerseits? Wahrscheinlich...


Könnt Ihr mir hier nochmal nen Tipp in die richtige Richtung geben?

Vielen Dank,
Karsten

Geändert von derkarsten (23-07-2003 um 12:52 Uhr)
derkarsten ist offline   Mit Zitat antworten
Alt 23-07-2003, 12:51   #12 (permalink)
Neuer User
 
Registriert seit: Feb 2002
Beiträge: 16
OK, OK.

Aehm.. das war wohl nicht ganz so dramatisch... wenn ich submenu[i][j] schreibe, gehts schon (ist trotzdem n komisches Konstrukt in Flash dan... normalerweise hätte er doch dann vorher "object" ausgeben müssen, oder?).

Trotzdem: anderes Problem: Wenn ich das ganze jetzt laufen lasse, produziert er leider nur Müll:

ActionScript:
  1. for (i in menu) {
  2.     duplicateMovieClip (mainButton, "mainButton"+i, i);
  3.     setProperty ("mainButton"+i, _x, _root.mainPositions[i]);
  4.     eval("mainButton"+i).dynTxtTxt = menu[i];
  5.     for (j in submenu[i]) {
  6.         duplicateMovieClip (subButton, "subButton"+i+"_"+j, j);
  7.         setProperty ("subButton"+i+"_"+j, _x, _root.mainPositions[i]);
  8.         eval("subButton"+j+"_"+i).dynTxtTxt = submenu[i][j];
  9.         j++;
  10.     }
  11.     j = 0;
  12.     i++;
  13. }

Jetzt positioniert er nur drei Movieclips auf der Bühne.. an relativ wirren Positionen... kann ich mir logisch grad nicht erklären.. ich häng zusätzlich nochmal das aktuelle .fla und .swf File an... vielleicht hat ja jemand von Euch nochmal kurz Zeit, sich das anzuschauen...

Vielen Dank!
Karsten
Angehängte Dateien
Dateityp: zip nav_test2.zip (5,9 KB, 25x aufgerufen)
derkarsten ist offline   Mit Zitat antworten
Alt 24-07-2003, 08:46   #13 (permalink)
Neuer User
 
Registriert seit: Feb 2002
Beiträge: 16
Hmm.. ich hab jetzt noch eine Weile rumprobiert... aber leider immer noch keine Lösung gefunden. Sobald ich die "innere" for-Schleife, oder besser gesagt den duplicateMovieClip in der for-Schleife auskommentiere funktioniert zumindest das mit den mainButtons wieder wunderbar.

Was mach ich falsch
derkarsten ist offline   Mit Zitat antworten
Alt 24-07-2003, 11:09   #14 (permalink)
Farbe ist Luxus
 
Benutzerbild von ludabruda
 
Registriert seit: May 2003
Ort: Köln
Beiträge: 2.405
Hi,

in beiden Schleifen hast du einen Zähler, dessen Wert beim duplidateMovie() als Tiefe dient.
Da beide Zähler sich zumindest stellenweise überschneiden, löschst du mit der zweiten Schleife die Movies aus der ersten Schleife...
Setz also einfach in der zweiten die Tiefe auf j+menu.length

Grüße
Sascha
__________________
12:15, press return
ludabruda ist offline   Mit Zitat antworten
Alt 24-07-2003, 12:22   #15 (permalink)
Neuer User
 
Registriert seit: Feb 2002
Beiträge: 16
hmm... das mit der Tiefengeschichte war n guter Tipp... Jetzt wird zumindest wieder munter dupliziert...

Allerdings seh ich nur zwei subButton-mcs, von denen nur einer korrekt ne Variable übergeben bekommt.

wenn ich mal proforma die ganzen subButton-mcs in nem onClipEvent(enterFrame) ihre jeweilige _x-Koordinate ausgeben lasse, kommt nur was von MC submenu3_3 zurück.

also quasi:

ActionScript:
  1. trace("1_1", subButton1_1._x);
  2. trace("1_2", subButton1_2._x);
  3. trace("1_3", subButton1_3._x);
  4. [...]
  5. trace("6_1", subButton1_1._x);
  6. trace("6_2", subButton1_2._x);
  7. trace("6_3", subButton1_3._x);

ergibt

ActionScript:
  1. 1_1:
  2. 1_2:
  3. 1_3:
  4. 1_4:
  5. 2_1:
  6. 2_2:
  7. 2_3:
  8. 2_4:
  9. 3_1:
  10. 3_2:
  11. 3_3:273
  12. 3_4:
  13. 4_1:
  14. 4_2:
  15. 4_3:
  16. 4_4:
  17. 5_1:
  18. 5_2:
  19. 5_3:
  20. 5_4:
  21. 6_1:
  22. 6_2:
  23. 6_3:
  24. 6_4:

daraus folgere ich mal, dass nur der subButton3_3 MC korrekt dupliziert wird... was ist denn da nu schon wieder los?

oh mann... sorry, dass ich Euch so nerve... Aber irgendwie ist das echt n seltsames Problem
derkarsten ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an



Alle Zeitangaben in WEZ +1. Es ist jetzt 21:52 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele