2010-08-14 4 views
0

Je charge un fichier SWF externe contenant des symboles MovieClip non instanciés. Je peux charger le fichier SWF, pas de problème. Si je l'appelle:AS3: Accès dynamique aux symboles externes de la bibliothèque

loader.contentLoaderInfo.applicationDomain.getDefinition("TestClip") as Class 

je reçois la classe d'un symbole bibliothèque appelée « TestClip », que je peux alors instancier. Jawesome. Le problème que je rencontre est que, fondamentalement, je veux avoir accès à tous les symboles de la bibliothèque sans avoir besoin de connaître explicitement leurs noms. J'espérais utiliser:

describeType(loader.contentLoaderInfo.applicationDomain); 

... pour obtenir un accès réfléchissant aux symboles de la bibliothèque, mais le retour XML ne semble pas inclure des références à eux. Peut-être que je l'appelle sur le mauvais objet? Je ne veux pas non plus avoir à créer explicitement des instances codées pour avoir accès. Ceci est pour un outil pour les artistes Flash, et il est important d'éviter le code, même le code simple.

Il doit y avoir un moyen d'accéder aux symboles. Toute suggestion sur la façon d'accomplir ceci serait appréciée!

connexes:

as3 - getting library symbols from an Assets class

AS3 - getting symbols from an assets library WITHOUT Flex

Flash AS3 : addChild() does not display imported movieclip

Répondre

1

http://www.bytearray.org/?p=175

http://etcs.ru/pre/getDefinitionNamesSource/

Ces deux classes semblent accomplir ce que je cherche à faire en analysant les données ByteArray brutes du fichier SWF. Je soumets ces derniers comme la meilleure réponse pour le moment, mais comme moyen natif pour accomplir ceci est toujours désiré. Cela obtiendra la réponse si quelqu'un peut montrer une telle méthode ici.

Un résumé rapide de l'utilisation de la seconde classe, getDefinitionNamesSource, car il est un peu plus simple à implémenter.

import ru.etcs.utils.getDefinitionNames; 

Bien sûr, importez la classe.

var classes : Array = getDefinitionNames(displayObject.loaderInfo.bytes); 

Ensuite, vous pouvez appeler ci-dessus où displayObject est une instancié DisplayObject, en lui transmettant soit le loaderInfo ou loaderInfo.bytes (la classe obtiendra les octets du loaderInfo, si c'est ce que vous passez). Il retourne un tableau des noms de classe. La bonne chose à propos de cette classe est qu'elle renvoie des classes non liées! Cela le rend idéal à cet effet! Vous pouvez ensuite utiliser getDefinition() sur le fichier SWF chargé pour obtenir la classe telle que vous puissiez l'instancier! Dans l'exemple suivant. Un fichier SWF avec des symboles MovieClip est chargé. Dans le gestionnaire Event.COMPLETE, le code suivant va instancier l'un de ces symboles comme myInstance, à quel point, vous pouvez faire ce que vous voulez.

var MyAsset : Class = loader.contentLoaderInfo.applicationDomain.getDefinition(classes[0]) as Class; 
var myInstance : MovieClip = new MyAsset(); 
Questions connexes