Zurück   Flashforum > Flash > Stuff

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 21-05-2007, 20:34   #1 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
Registriert seit: Mar 2006
Beiträge: 1.573
HierarchyManager

Ja so nenn ich das ganze mal
Da viele (und ich es mich auch) schon immer gefragt habe, wie man denn
eine globale Pause einfügen könnte, die alle Animationen des Filmes stopt,
hab ich mal versucht vorhin was zu basteln, und dieses mit ein paar weiteren
Funktionen erweitert. Nix weltbewegendes aber bestimmt nützlich für viele:

ActionScript:
  1. class HierarchyManager
  2. {
  3.     // getAllChildsFrom (target : MovieClip) : Array
  4.     // ---------------------------------------------
  5.     public function getAllChildsFrom (target : MovieClip) : Array
  6.     {
  7.         var childs : Array = [];
  8.        
  9.         for (var i : String in target)
  10.         {
  11.             if (typeof (target[i]) == "movieclip")
  12.             {
  13.                 var child : MovieClip = target[i];       
  14.                
  15.                 if (getAllChildsFrom (child).length != 0)
  16.                 {
  17.                     childs.push (child);                   
  18.                    
  19.                     for (var j : Number = 0; j < getAllChildsFrom (child).length; j++)
  20.                     {
  21.                         childs.push (getAllChildsFrom (child)[j]);
  22.                     }
  23.                 }
  24.                 else
  25.                 {
  26.                     childs.push (child);
  27.                 }
  28.             };
  29.         }
  30.         return (childs);
  31.     }
  32.    
  33.     // stopAllMotions (Void) : Void
  34.     // ----------------------------
  35.     public function stopAllMotions (Void) : Void
  36.     {
  37.         var gChilds : Array = getAllChildsFrom (_level0);
  38.        
  39.         for (var i : Number = 0; i < gChilds.length; i++)
  40.         {
  41.             gChilds[i].stop ();
  42.         }
  43.     }
  44.    
  45.     // setPropertyForAllChildsFrom (target : MovieClip, property : String, value : Object) : Void
  46.     // ------------------------------------------------------------------------------------------
  47.     public function setPropertyForAllChildsFrom (target : MovieClip, property : String, value : Object) : Void
  48.     {
  49.         var gChilds : Array = getAllChildsFrom (_level0);
  50.        
  51.         for (var i : Number = 0; i < gChilds.length; i++)
  52.         {
  53.             gChilds[i][property] = value;
  54.         }
  55.     }
  56.    
  57.     // hasChilds (target : MovieClip) : Boolean
  58.     // ----------------------------------------
  59.     public function hasChilds (target : MovieClip) : Boolean
  60.     {
  61.         return ((getAllChildsFrom (target).length != 0) ? true : false);
  62.     }
  63. };

Viels Spaß und Kritk und Verbesserungsvorschläge natürlich willkommen
edit => kleine Rechtschreibfehler
__________________

Currently working on:

- --- ---

-----------------------------------------------------------------
ActionScript 3.0, C++, Java, Delphi

Geändert von _crypto_ (21-05-2007 um 20:42 Uhr)
_crypto_ ist offline   Mit Zitat antworten
Alt 23-05-2007, 11:55   #2 (permalink)
muh
 
Benutzerbild von Janoscharlipp
 
Registriert seit: Apr 2002
Ort: Freiburg / Stuttgart
Beiträge: 4.338
Schicke Sache, aber ich hätte noch zwei Verbesserungsvorschläge:
1) Wenn sich zwei MovieClips gegenseitig referenzieren, dürfte im Moment eine Endlosrekursion auftreten
2) du solltest die children in einer lokalen Variable zwischenspeichern, im Moment wird die Funktion in jedem Schleifendurchlauf aufgerufen.
__________________
»Carpe diem«, sagte der Graf. (Terry Pratchett: Ruhig Blut!)
Janoscharlipp ist offline   Mit Zitat antworten
Alt 23-05-2007, 21:08   #3 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
Registriert seit: Mar 2006
Beiträge: 1.573
2. stimm ich zu und werde ich ändern

aber 1. verseth ich nciht so ganz. wie können sich den 2 MCs gegenseitg "verKindern" oder wie meinst du das?
__________________

Currently working on:

- --- ---

-----------------------------------------------------------------
ActionScript 3.0, C++, Java, Delphi
_crypto_ ist offline   Mit Zitat antworten
Alt 23-05-2007, 22:28   #4 (permalink)
voidboy
 
Benutzerbild von rendner[i]
 
Registriert seit: Sep 2004
Ort: München
Beiträge: 5.588
Probier es doch mal aus.
Also Mc A hat als child mc B und mc B hat als child mc A.

Bitte rekursiv lesen:
Nun rufst du die Methode "getAllChildsFrom" für mc A auf, diese ruft wiederum für alle MovieClips in A die Methode "getAllChildsFrom" auf.
Da mc B ein child von mc A ist wird für mc B die Methode aufgerufen.
In mc B befindet sich mc A, also wird für mc A die Methode "getAllChildsFrom" aufgerufen.
__________________
ERROR: Signature is too large
rendner[i] ist offline   Mit Zitat antworten
Alt 23-05-2007, 22:47   #5 (permalink)
dreizeiler
 
Benutzerbild von mojave
 
Registriert seit: Sep 2004
Ort: Berlin
Beiträge: 1.411
ich würde es wahrscheinlich so machen, dass sich die mc's an einem singleton timelineManager anmelden oder so...

aber egal.


bei der hasChilds methode würde ich nicht einen solchen hammer starten, sondern gleich beim ersten child returnen.
mojave ist offline   Mit Zitat antworten
Alt 24-05-2007, 13:09   #6 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
Registriert seit: Mar 2006
Beiträge: 1.573
Zitat:
Zitat von rendner[i] Beitrag anzeigen
Probier es doch mal aus.
Also Mc A hat als child mc B und mc B hat als child mc A.

Bitte rekursiv lesen:
Nun rufst du die Methode "getAllChildsFrom" für mc A auf, diese ruft wiederum für alle MovieClips in A die Methode "getAllChildsFrom" auf.
Da mc B ein child von mc A ist wird für mc B die Methode aufgerufen.
In mc B befindet sich mc A, also wird für mc A die Methode "getAllChildsFrom" aufgerufen.
ja und? dann is der nächste schritt aber getAllChildsFrom( MCa.MCb.MCa ) und nicht
getAllChildsFrom (MCa). Also so habe cih dich jetzt verstanden. korrigier mich falls ich daneben liege

------------------------------------------------------------------
so mal eine neue version:
ActionScript:
  1. class TimelineManager
  2. {
  3.     // getAllChildsFrom (target : MovieClip) : Array
  4.     // ---------------------------------------------
  5.     public function getAllChildsFrom (target : MovieClip) : Array
  6.     {
  7.         var rt : Array = [];
  8.        
  9.         for (var i : String in target)
  10.         {
  11.             if (typeof (target[i]) == "movieclip")
  12.             {
  13.                 var child  : MovieClip = target[i];    
  14.                 var childs : Array     = getAllChildsFrom (child);
  15.                                 var isSet  : Boolean  = false;
  16.                
  17.                 for (var c : Number = 0; c < childs.length; c++)    {
  18.                     if (child == childs[c]) isSet = true;
  19.                 }
  20.  
  21.                 if (!isSet)
  22.                 {
  23.                     if (childs.length != 0)
  24.                     {
  25.                         rt.push (child);                   
  26.                    
  27.                         for (var j : Number = 0; j < childs.length; j++)
  28.                         {
  29.                             rt.push (childs[j]);
  30.                         }
  31.                     }
  32.                     else
  33.                     {
  34.                         rt.push (child);
  35.                     }
  36.                 }
  37.             };
  38.         }
  39.         return (rt);
  40.     }
  41.    
  42.     // stopAllMotions (Void) : Void
  43.     // ----------------------------
  44.     public function stopAllMotions (Void) : Void
  45.     {
  46.         var gChilds : Array = getAllChildsFrom (_level0);
  47.        
  48.         for (var i : Number = 0; i < gChilds.length; i++)
  49.         {
  50.             gChilds[i].stop ();
  51.         }
  52.     }
  53.    
  54.     // setPropertyForAllChildsFrom (target : MovieClip, property : String, value : Object) : Void
  55.     // ------------------------------------------------------------------------------------------
  56.     public function setPropertyForAllChildsFrom (target : MovieClip, property : String, value : Object) : Void
  57.     {
  58.         var childs : Array = getAllChildsFrom (target);
  59.        
  60.         for (var i : Number = 0; i < childs.length; i++)
  61.         {
  62.             childs[i][property] = value;
  63.         }
  64.     }
  65.    
  66.     // hasChilds (target : MovieClip) : Boolean
  67.     // ----------------------------------------
  68.     public function hasChilds (target : MovieClip) : Boolean
  69.     {      
  70.         for (var i : String in target)
  71.         {
  72.             if (typeof (target[i]) == "movieclip") {
  73.                     return (true);
  74.                         };
  75.         }
  76.     }
  77. };

habe soweit alle vorschläge berücksichtig. schonmal danke dafür
__________________

Currently working on:

- --- ---

-----------------------------------------------------------------
ActionScript 3.0, C++, Java, Delphi

Geändert von _crypto_ (24-05-2007 um 20:42 Uhr)
_crypto_ ist offline   Mit Zitat antworten
Alt 24-05-2007, 13:35   #7 (permalink)
voidboy
 
Benutzerbild von rendner[i]
 
Registriert seit: Sep 2004
Ort: München
Beiträge: 5.588
Zitat:
Zitat von _crypto_ Beitrag anzeigen
ja und? dann is der nächste schritt aber getAllChildsFrom( MCa.MCb.MCa ) und nicht
getAllChildsFrom (MCa). Also so habe cih dich jetzt verstanden. korrigier mich falls ich daneben liege
Ich denke du liegst falsch.
Nochmal Schritt für Schritt:
Wenn ich für MC A die Methode aufrufe, wird die Methode für jeden MC in A aufgerufen.
Somit auch für B.
Nun wird für jeden MC in B die Methode aufgerufen somit auch wieder für MC A weil dieser dieser ja in B gespeichert ist.
Somit wird für mc A die Methode aufgerufen und für alle MC's in A, also auch B die Methode ebenfalls aufgerufen...

Jetzt muss es doch langsam klick gemacht haben, sonst hilft nur noch die harte Tour:
PHP-Code:
var a:MovieClip this.createEmptyMovieClip"a");
var 
b:MovieClip this.createEmptyMovieClip"b");

a.b;
b.a;

var 
tm:TimelineManager = new TimelineManager();
tracetm.getAllChildsFrom) ); 
__________________
ERROR: Signature is too large
rendner[i] ist offline   Mit Zitat antworten
Alt 24-05-2007, 13:36   #8 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
Registriert seit: Mar 2006
Beiträge: 1.573
[QUOTE='rendner[i];1647129']
Zitat:
Zitat von _crypto_ Beitrag anzeigen
ja und? dann is der nächste schritt aber getAllChildsFrom( MCa.MCb.MCa ) und nicht
getAllChildsFrom (MCa). Also so habe cih dich jetzt verstanden. korrigier mich falls ich daneben liege

Ich denke du liegst falsch.
Nochmal Schritt für Schritt:
Wenn ich für MC A die Methode aufrufe, wird die Methode für jeden MC in A aufgerufen.
Somit auch für B.
Nun wird für jeden MC in B die Methode aufgerufen somit auch wieder für MC A weil dieser dieser ja in B gespeichert ist.
Somit wird für mc A die Methode aufgerufen und für alle MC's in A, also auch B die Methode ebenfalls aufgerufen...

Jetzt muss es doch langsam klick gemacht haben, sonst hilft nur noch die harte Tour:
PHP-Code:
var a:MovieClip this.createEmptyMovieClip"a");
var 
b:MovieClip this.createEmptyMovieClip"b");

a.b;
b.a;

var 
tm:TimelineManager = new TimelineManager();
tracetm.getAllChildsFrom) ); 
sofort verstanden ich habe nciht an diese art gedacht. also manuel klapt es, ahbe es probiert. und so? hast du es mal ausprobiert?
__________________

Currently working on:

- --- ---

-----------------------------------------------------------------
ActionScript 3.0, C++, Java, Delphi
_crypto_ ist offline   Mit Zitat antworten
Alt 24-05-2007, 16:48   #9 (permalink)
voidboy
 
Benutzerbild von rendner[i]
 
Registriert seit: Sep 2004
Ort: München
Beiträge: 5.588
Zitat:
Zitat von _crypto_ Beitrag anzeigen
hast du es mal ausprobiert?
Mittlerweile ja, aber mit der ersten Version und der Player meldetet mir mehr als 256 Funktionsaufrufe.
Also Endlosrekursion.
__________________
ERROR: Signature is too large
rendner[i] ist offline   Mit Zitat antworten
Alt 24-05-2007, 19:14   #10 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
Registriert seit: Mar 2006
Beiträge: 1.573
ja ich habe in der neuen nur die lokalen variablen in die schleife gesetzt.

ich wüste aber jetztauch nicht, wie ich dass verhindern soll bzw. umgehen kann?
has du ne idee?

@ mojave

wie kann man den aus ner for-schleife oder if bedingung so "breaken" ? damit ich direkt beim ersten
was zurückgeben kann.

DAS wäre wieder son punkt wo mir C++ besser gefällt da das return immer auf die funktion "zeigt"
und nicht bei einer if bedingung schon faxen macht da es da nicht returnen kann und dass return driekt die
funtkionbeedent naja mal schuan ich weiß nciht habs noch nciht in AS 3 probiert ^^
__________________

Currently working on:

- --- ---

-----------------------------------------------------------------
ActionScript 3.0, C++, Java, Delphi

Geändert von _crypto_ (24-05-2007 um 19:22 Uhr)
_crypto_ ist offline   Mit Zitat antworten
Alt 24-05-2007, 19:39   #11 (permalink)
dreizeiler
 
Benutzerbild von mojave
 
Registriert seit: Sep 2004
Ort: Berlin
Beiträge: 1.411
naja,
PHP-Code:
for(var i in x){
   if(
typeof x[i] == 'movieclip')
       return 
true;

mojave ist offline   Mit Zitat antworten
Alt 24-05-2007, 20:02   #12 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
Registriert seit: Mar 2006
Beiträge: 1.573
Zitat:
Zitat von mojave Beitrag anzeigen
naja,
PHP-Code:
for(var i in x){
   if(
typeof x[i] == 'movieclip')
       return 
true;

das ist komisch. sonst gabs immer ne fehlermeldung weil die funktion keinen
wert zurückliefert hmmmm.... egal änder ich mal.
__________________

Currently working on:

- --- ---

-----------------------------------------------------------------
ActionScript 3.0, C++, Java, Delphi
_crypto_ ist offline   Mit Zitat antworten
Alt 24-05-2007, 20:08   #13 (permalink)
voidboy
 
Benutzerbild von rendner[i]
 
Registriert seit: Sep 2004
Ort: München
Beiträge: 5.588
Zitat:
Zitat von _crypto_ Beitrag anzeigen
ja ich habe in der neuen nur die lokalen variablen in die schleife gesetzt.

ich wüste aber jetztauch nicht, wie ich dass verhindern soll bzw. umgehen kann?
has du ne idee?
Man müsste prüfen ob der MovieClip schon im Array vorhanden ist, anders geht es nicht.
Da ja auch folgendes auftreten kann (lässt sich "unendlich" fortsetzen):
PHP-Code:
var a:MovieClip this.createEmptyMovieClip"a");
var 
b:MovieClip this.createEmptyMovieClip"b");
var 
c:MovieClip this.createEmptyMovieClip"c");

a.mc b;
b.mc c
c.mc a
__________________
ERROR: Signature is too large
rendner[i] ist offline   Mit Zitat antworten
Alt 24-05-2007, 20:38   #14 (permalink)
Neuer User
 
Benutzerbild von _crypto_
 
Registriert seit: Mar 2006
Beiträge: 1.573
aber vorher den array durchgehen und das bei jedem child? bisschen exteem später mal
gibts keine andere möglichkeit?
__________________

Currently working on:

- --- ---

-----------------------------------------------------------------
ActionScript 3.0, C++, Java, Delphi
_crypto_ ist offline   Mit Zitat antworten
Alt 25-05-2007, 07:14   #15 (permalink)
voidboy
 
Benutzerbild von rendner[i]
 
Registriert seit: Sep 2004
Ort: München
Beiträge: 5.588
Kostengünstigere Variante währe, wenn du jeden MovieClip den du besucht hast markierst (eine bestimmte Variable in diesem ablegst).
Dann rufst du nur die Methode für die noch nicht markierten auf.
Am ende deiner Methode solltest du aber wieder diese Variablen aus den MovieClips entfernen damit ein erneuter Aufruf deiner Methode wieder funktioniert.

Fakt ist das du auf jeden Fall prüfen musst ob du den MovieClip schon abgeklappert hast, wie du das letztendlich umsetzt ist egal.
__________________
ERROR: Signature is too large
rendner[i] 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 19:13 Uhr.

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


Copyright ©1999 – 2012 Marc Thiele