2009-08-28 9 views
1

Comment accéder aux éléments de la bibliothèque à partir de classes autres que la classe de document?AS3 - Accès aux éléments de la bibliothèque en dehors de la classe Document

Par exemple, si je crée un clip en Flash et d'exportation pour Actionscript avec le nom Foo, je peux le faire dans la classe de document:

var f = new Foo(); 
this.addChild(f); 

Et il apparaît sur la scène, comme devrait. Mais je dois être capable de créer d'autres instances de cet objet à partir d'autres classes. Si j'utilise le même code ci-dessus dans SomeOtherClass.as, je n'ai rien sur la scène, évidemment parce que cette classe ne connaît pas l'objet Foo dans la bibliothèque.

Je sais que j'ai probablement besoin d'utiliser appplicationDomain.getDefinition en quelque sorte. Cela ne fonctionne pas:

var a = new ApplicationDomain(ApplicationDomain.currentDomain); 
var foo: Class = a.getDefinition ("com.me.CustomClass") ; 
var f = new foo() ; 
addChild (f) ; 

TypeError: Erreur # 1007: Tentative d'instanciation sur un non-constructeur.

Répondre

0

Je ne me souviens pas de ce problème. Je pense (cela fait un moment!) Que vous avez besoin d'écrire une classe de code dérivée de MovieClip ou similaire et associer avec l'élément de la bibliothèque quelque part dans ses propriétés. Bien sûr, une fois cela fait, vous pouvez traiter les classes de la bibliothèque comme n'importe quelle autre classe.

EDIT:

essayez ceci:

var foo:Class=loaderInstance.contentLoaderInfo.applicationDomain.getDefinition("MyClass"); 
var x:*=new foo(); 

À la lecture plus de votre problème, je me rends compte que ce code est à côté du chargeur, pas le côté loadee. Bien aboyer pourtant le bon arbre.

+0

Oui, votre code fonctionne s'il est appelé dans le chargeur, mais dans ce cas, je peux accéder à la bibliothèque de toute façon sans utiliser applicationDomain. Je voudrais savoir comment utiliser ce même type d'appel, mais dans le "loadee" (le swf chargé secondaire). –

0

Essayez quelque chose comme ceci:

var foo:Class = ApplicationDomain.currentDomain.getDefinition("SymbolName") as Class; 

Je crois que le nom du symbole ne devrait pas avoir un nom de package au début, pour un symbole de la bibliothèque.

+0

ReferenceError: Erreur n ° 1065: La variable CustomClass n'est pas définie. J'essaie d'accéder à la bibliothèque à partir d'un fichier SWF secondaire chargé. Je dois avoir accès à la bibliothèque du parent swf. –

1

Cela ressemble à un problème de domaine d'application. Le swf chargé ne peut pas accéder aux classes définies dans le chargeur.

Vous devez autoriser l'accès swf chargé à la bibliothèque swf du chargeur. Essayez d'utiliser LoaderContext.

Du haut de ma tête:

var loader:Loader = new Loader(); 
var ctx:LoaderContext = new LoaderContext(false,ApplicationDomain.current); 
loader.load(yourRequest,ctx); 
+0

Si j'utilise votre suggestion dans le chargeur, quel serait le code pour créer une instance d'un objet de la bibliothèque principale, appelée à partir d'une autre classe compilée avec le swf enfant? –

+0

essayez ceci: var clazz: Class = loaderInfo.applicationDomain.getDefinition ("ClassName") comme classe; var instance: ClassName = nouveau clazz(); –

0

Je trouve ces réponses un peu trop cuit, parce que tout ce que j'ai jamais fait d'utiliser un élément de la bibliothèque de toute classe est à importer comme toute importation standard . C'est pourquoi nous sélectionnons Export for Actionscript.

Par exemple:

package 
{ 
    import foo;      // Library MovieClip 
    import flash.display.MovieClip; // Must import MovieClip to Extend it. 
    ....... 

    public class something extends MovieClip 
    { 
    private var _foo:foo; // Create a local reference of the imported Library Item. 
    ...... 

    public function something():void 
    { 
    _foo = new foo(); // Create a new instance of the imported Library Item. 
    ......... 
    } 
    } 
    } 

Je trouve cela fonctionne à chaque fois, ne peut pas dire si oui ou non il est la bonne façon. Mais cela fonctionne pour moi.

+0

Cela fonctionne dans le même swf, mais vous ne pouvez pas le faire pour instancier à partir des définitions de classe dans un swf chargé de l'extérieur, ce qui est ce que l'affiche demande, sur la base de ses commentaires de clarification. –

Questions connexes