2012-09-21 5 views
0

Im chargement de plusieurs SWF du même fichier Exemple:AS # 3 chargement SWF multiple

 var movies:Array = new Array ("Symbols/00.swf","Symbols/00.swf","Symbols/00.swf"); 

Ma méthode de chargement fonctionne très bien, au-dessous im en utilisant:

var perc:int = (event.bytesLoaded/event.bytesTotal) * 100; 
Loading.text = "loading " +perc + "%"; 

Le problème im est tout le le texte de chargement est à% 100 après le téléchargement d'un élément de Movies: Array.

Cela se produirait car les fichiers restants sont déjà dans la capture.

La question est: Comment pourrais-je être en mesure de ralentir ce texte de chargement pour déterminer si tous les éléments sont ready.Basically le problème est que le texte de chargement saids complet, mais tous mes autres fichiers ne sont pas encore prêts ...

Répondre

1

Premièrement, pourquoi charger un fichier SWF plusieurs fois? Vous pouvez utiliser l'astuce suivante: How to display multiple instances of loaded SWF. Ensuite, vous utilisez votre objet Loader pour charger un fichier SWF à la fois et sa progression sera liée à ce fichier SWF unique. Ainsi, vous devez d'abord charger tous les fichiers SWF uniques et stocker leurs références Loader quelque part, afin d'en instancier davantage si vous en avez besoin, et ensuite, vous devez collecter le pourcentage total de l'écouteur d'événement de progression. Ce dernier est légèrement compliqué, car vous utilisez très probablement un seul écouteur d'événement de progression pour tous les chargeurs. Vous, par exemple, peut faire quelque chose comme ceci:

public static var ALL_LOADERS:Object; 
public static var PROGRESS_DATA:Object; // we need associative arrays here 
public static var BYTES_LOADED:int=0; 
public static var TOTAL_BYTES:int=0; 

public static function RegisterLoader(path:String,loader:Loader):void { 
    if (!ALL_LOADERS) ALL_LOADERS=new Object(); 
    if (!PROGRESS_DATA) PROGRESS_DATA=new Object(); 
    ALL_LOADERS[path]=loader; 
    PROGRESS_DATA[loader]=new Object(); 
    PROGRESS_DATA[loader].bytesLoaded=0; 
    PROGRESS_DATA[loader].bytesTotal=-1; 
} 

// now a listener 
public static function progressListener(e:Event):void { 
    var l:Loader=e.target as Loader; 
    if (!l) return; // that wasn't a loader that sent the event. Uh oh 
    var plo:Object=PROGRESS_DATA[l]; 
    if (!plo) return; // unregistered loader. Ignore 
    if (plo.bytesTotal<0) { 
     plo.bytesTotal=e.bytesTotal; 
     TOTAL_BYTES+=e.bytesTotal; 
    } 
    var pbl:int=plo.bytesLoaded; 
    plo.bytesLoaded=e.bytesLoaded; 
    LOADED_BYTES+=(e.bytesLoaded-pbl); 
    var perc:int = (LOADED_BYTES/TOTAL_BYTES) * 100; 
    Loading.text = "loading " +perc + "%"; 
} 

Notez que le processus de chargement est conçu pour être exécuté qu'une seule fois, toute l'initialisation se fait une fois, et ce code ne pas le traitement des erreurs - vous pouvez, Cependant, écrivez-le vous-même.

+0

la raison iv chargé multiples parce qu'il était plus facile, il y a en fait 300 éléments dans le tableau à charger, mais tous les doublons.10 films SWF * 30 .. = lol votre probablement je devrais gérer cela mieux, je donne votre option un essai – joshua

+0

J'ai trouvé un moyen facile de dupliquer une classe, ou swf externe cela a bien fonctionné, c'est environ 4 lignes de code. – joshua

+0

Voulez-vous dire utiliser getQualifiedClassName (source) 'then' getDefinitionByName (sourceString) 'puis instancier? C'est faisable, mais si votre classe ne nécessite pas de personnalisation après la création. – Vesper

Questions connexes