Zurück   Flashforum > Flash > Stuff

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 04-01-2007, 16:00   #1 (permalink)
-
 
Benutzerbild von pape
 
Registriert seit: Jan 2004
Beiträge: 3.002
[Stuff] Functions mit oEF nacheinander ausführen

Hi!

Gestern habe ich sowas benötigt und dachte, dass es vllt auch andere gebrauchen könnten. Vielleicht gibt es auch eine elegantere Lösung, aber das hier ist meine - Verbesserungsvorschläge sind aber immer willkommen

Wenn man nacheinander ein paar Events ausführen möchte und die einzelnen Events unterschiedlich lang sind, muss man auf eine Variable zurückgreifen, die einem mitteilt, wann es weiter gehen kann.
Sobald man mehr als eine Aktion hintereinander ausführen möchte, wird das schnell sehr unübersichtlich:
ActionScript:
  1. macheDies();
  2. this.onEnterFrame = function () {
  3.   if(macheDies_ready) {
  4.     delete this.onEnterFrame;
  5.     macheJenes();
  6.     this.onEnterFrame = function () {
  7.       if(macheJenes_ready) {
  8.         delete this.onEnterFrame;
  9.         trace("fertig");
  10.       }
  11.     }
  12.   }
  13. }
Denkbar wäre so etwas z.b. bei einem Animierten mehrdimensionalen Menü:
fadeSubSubMenuAus();
fadeSubMenuAus();
WechsleHauptMenu();
..

Um diese unübersichtliche Verschachtelung zu umgehen habe ich diese Funktion geschrieben:
ActionScript:
  1. _global.tl = this;
  2. action = tl.createEmptyMovieClip("action", tl.getNextHighestDepth());
  3. action.go = function (arr) {
  4.     if(arr.length > 0) {
  5.         this.arr = arr;
  6.         tl[this.arr[0][0]].status = 0;
  7.         eval(arr[0][0] + "." + arr[0][1])(arr[0][2]); // [Object]. [fn] ([parameter])
  8.         this.onEnterFrame = function() {
  9.             if(tl[this.arr[0][0]].status) {
  10.                 delete this.onEnterFrame;
  11. //        trace(this.arr[0][0] + "." + this.arr[0][1] + " is ready"); //gibt die beendete Funktion aus
  12.                 this.arr.shift();
  13.                 this.go(this.arr);
  14.             }
  15.         }
  16.     }
  17. };

Sie geht davon aus, dass alle Funktionen die nacheinander ausgeführt werden sollen, einem (oder mehreren) Objekten (z.B. MovieClips) zugeordnet sind. Die Aktionen müssen also so deklariert werden:
ActionScript:
  1. _global.tl = this;
  2. tl.createEmptyMovieClip("myObject", tl.getNextHighestDepth());
  3. myObject.status = 0;
  4. myObject.myFunction1 = function () {
  5.     this.status = 0;
  6.     //Aktionen
  7.     this.status = 1;
  8. }
  9. myObject.myFunction2 = function (parameter) {
  10.     this.status = 0;
  11.     //Aktionen
  12.     this.status = 1;
  13. }
  14. tl.createEmptyMovieClip("myObject2", tl.getNextHighestDepth());
  15. myObject2.status = 0;
  16. myObject2.myFunction1 = function (parameter) {
  17.     this.status = 0;
  18.     //Aktionen
  19.     this.status = 1;
  20. }
die Status-variable gibt dabei an wann die nächste Aktion ausgeführt werden darf. Sobald sie auf 1 steht, gehts weiter.

Um nun mehrere Funktionen hintereinander auszuführen, übergibt man der Aktions-Funktion ein zweidimensionales Array, welches so aufgebaut ist:
ActionScript:
  1. action.go([
  2. //    [Object, Function, Parameter],
  3. //Bsp
  4.     ["myObject", "myFunction1", undefined], //keine Parameter
  5.     ["myObject", "myFunction2", 10], //einen Parameter
  6.     ["myObject2", "myFunction1", ["hallo", 2]] //mehrere Parameter
  7. ]);
Das Array mit den Parametern wird einfach als Array beim Aufruf der Funktion übergeben. Wenn es nur einen Parameter gibt, kann dieser auch einfach so übergeben werden.
Keine Parameter kann man einfach durch ein "undefined" eine 0 oder ähnliches angeben.

Ein komplettes Beispiel könnte so aussehen:
ActionScript:
  1. _global.tl = this;
  2.  
  3. var r = tl.createEmptyMovieClip("Restaurant", tl.getNextHighestDepth());
  4. r.status = 0;
  5. r.hinfahren = function (Uhrzeit) {
  6.     this.status = 0;
  7.     trace("Losgefahren um " + Uhrzeit);
  8.     this.c = 0;
  9.     this.onEnterFrame = function () {
  10.         this.c++;
  11.         if(this.c>30){
  12.             trace("Nach "+this.c+" Minuten angekommen");
  13.             delete this.onEnterFrame;
  14.             this.status = 1;
  15.         }
  16.     }
  17. }
  18. r.bestellen = function (Bestellung) {
  19.     this.status = 0;
  20.     trace("Ich haette gerne " + Bestellung[0]+ " mit " + Bestellung[1]);
  21.     this.c = 0;
  22.     this.onEnterFrame = function () {
  23.         this.c++;
  24.         if(this.c>=20){
  25.             trace("Der Ober bringt das Essen nach "+this.c+" Minuten \n Guten Hunger!");
  26.             delete this.onEnterFrame;
  27.             this.status = 1;
  28.         }
  29.     }
  30. }
  31. var z = tl.createEmptyMovieClip("ZuHause", tl.getNextHighestDepth());
  32. z.status = 0;
  33. z.daSein = function (Uhrzeit) {
  34.     this.status = 0;
  35.     trace("Um " + Uhrzeit +" zu Hause sein");
  36.     trace("nix wie los...");
  37.     this.status = 1;
  38. }
  39.  
  40. action = tl.createEmptyMovieClip("action", tl.getNextHighestDepth());
  41. action.go = function (arr) {
  42.     if(arr.length > 0) {
  43.         this.arr = arr;
  44.         tl[this.arr[0][0]].status = 0;
  45.         eval(arr[0][0] + "." + arr[0][1])(arr[0][2]); // [Object]. [fn] ([parameter])
  46.         this.onEnterFrame = function() {
  47.             if(tl[this.arr[0][0]].status) {
  48.                 delete this.onEnterFrame;
  49. //        trace(this.arr[0][0] + "." + this.arr[0][1] + " is ready");
  50.                 this.arr.shift();
  51.                 this.go(this.arr);
  52.             }
  53.         }
  54.     }
  55. };
  56. tmp_go = Array();
  57. tmp_go.push(["Restaurant", "hinfahren", "20:00"]);
  58. tmp_go.push(["Restaurant", "bestellen", ["Schnitzel", "Cola"]]);
  59. tmp_go.push(["ZuHause", "daSein", "22:00"]);
  60. action.go(tmp_go);

Das Beispiel gibts auch im Anhang.

Viel Spaß damit!
Angehängte Dateien
Dateityp: rar fn_nacheinander.rar (4,5 KB, 21x aufgerufen)

Geändert von pape (04-01-2007 um 16:02 Uhr)
pape ist offline   Mit Zitat antworten
Alt 04-01-2007, 17:10   #2 (permalink)
dreizeiler
 
Benutzerbild von mojave
 
Registriert seit: Sep 2004
Ort: Berlin
Beiträge: 1.411
mmmh ich weiß nicht ob das so viel sinn macht...?

wie wäre es denn einfach events zu werfen wenn eine aktion vorbei ist und einfach darauf zu reagieren..?
mojave ist offline   Mit Zitat antworten
Alt 04-01-2007, 17:53   #3 (permalink)
-
 
Benutzerbild von pape
 
Registriert seit: Jan 2004
Beiträge: 3.002
Dann wäre es aber nicht mehr dynamisch, weil jedes Event ja nur einmal definiert werden kann. Man müsste dann um es dynamisch zu halten Unmengen von Parameterabfragen machen um den richtigen Handlungsstrang zu verfolgen.
Bei mir kann man es einfach so machen:
ActionScript:
  1. tmp_go.push(["Navi", "deaktivieren", undefined]);
  2. if(SubMenuIstAusgefahren) {
  3.   tmp_go.push(["Navi", "subMenuEinfahren", SubMenuId]);
  4. }
  5. tmp_go.push(["Navi", "subMenuAusfahren", newSubMenuId]);
  6. tmp_go.push(["Navi", "aktivieren", undefined]);
  7. action.go(tmp_go);
Das kann man beliebig verschachteln und hat somit einen voll dynamischen Handlungsverlauf ohne dass die Aktionen sich gegenseitig in die Quere kommen.
Es ging ja darum, dass man dynamisch einen Handlungsstrang definieren kann und dieser abgearbeitet wird, ohne dass die Dinge gleichzeitig passieren.
Oder habe ich da irgendwas bei den Events verpasst ?

Geändert von pape (04-01-2007 um 17:57 Uhr)
pape 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 18:29 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele