2012-08-16 1 views
2

Je travaille sur un projet flash dans lequel j'ai un swf avec un tas d'actifs artistiques. Cependant, ils ne sont pas sur la scène, il y a simplement dans la bibliothèque, et lié au code que j'ai écrit.Obtenir un enfant nommé d'un MovieClip à partir d'un swf externe

J'ai une classe que je voudrais instancier, mais je continue d'obtenir une erreur de référence lors de sa construction.

Voilà comment le swf/Library fla est mis en place

[MovieClip]ButtonPopup, Linkage:com.packagename.ButtonPopup 
[MovieClip]popup_btn, Linkage: none 

popup_btn est un enfant de Popup, et porte bien son nom _popup_btn (avec un getter généré par Flash Builder appelé popup_btn) dans le Flash CS5.5 IDE . Voici la classe Popup:

package com.packagename.ButtonPopup { 

    public class ButtonPopup extends Popup { 
     public Popup() { 
      addClickListeners(popup_btn); 
     } 

     protected function get popup_btn():MovieClip { 
      return this["_popup_btn"]; 
     } 
    } 
} 

package com.packagename.Popup { 
    public class Popup extends MovieClip { 
     public Popup() { 

     } 

     protected function addClickListeners(mc:MovieClip) { 
      //add click listeners 
     } 
    } 
} 

Mon principal swf ressemble donc:

public MainClass() { 
    var loader:Loader = new Loader(); 
    loader.load(new URLRequest("assets.swf")); 
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadArtComplete); 
} 

function loadArtComplete (e:Event):void { 
    var popup_class:Class = e.target.applicationDomain.getDefinition("com.packagename::Popup"); 
    var popup_mc:MovieClip = new popup_class() as MovieClip; 

    addChild(popup_mc); 
} 

Malheureusement, je reçois une erreur sur la ligne var popup_mc:MovieClip = new popup_class() as MovieClip:

ReferenceError: Error #1056: Cannot create property _popup_btn on com.packagename.Popup 
    at flash.display::Sprite/constructChildren() 
    at flash.display::Sprite() 
    at flash.display::MovieClip() 
    at com.packageName.Popup() [file path] 
    at com.packageName.MainClass/loadArtComplete() [filepath] 

Si je quitte le popup_btn sans nom dans l'EDI Flash, je ne reçois pas d'erreur, mais je ne peux pas faire référence à MovieClip (pour ajouter des écouteurs de clic, etc.), donc c'est une solution impossible.

Est-ce que quelqu'un a des idées sur ce qu'il faut faire ici? Est-ce que je ne peux pas instancier un MovieClip "complexe" mais plutôt instancier chaque MovieClip enfant, un par un?

EDIT: Après un peu plus de tests, il semble que cela ait à voir avec le fait que la classe de problème n'hérite pas directement de MovieClip, mais d'une autre classe (qui hérite de MovieClip). J'ai mis à jour le code source pour refléter cela. Je ne sais toujours pas si c'est le cas (sinon hériter de MovieClip causerait un problème). Mais on verra.

Merci,
-esa

Répondre

1

Il y a deux solutions: Définissez votre classe comme dynamique:

public dynamic class ButtonPopup extends Popup 

alors vous n'aurez pas le flash erreur

OU

Vous devez créer un var public nommé "_popup_btn" (tapé avec SimpleButton ou MovieClip) dans votre ButtonPo classe chiot, alors Flash va définir cette variable avec l'instance de votre popup_btn.

+0

Est-ce que cela n'est pas atténué si l'option "Déclarer automatiquement les instances d'étape" est cochée? Devrai-je faire cela pour chaque MovieClip (récursivement dans la hiérarchie)? _popup_btn est composé de encore plus de MovieClips, et devoir déclarer chacun de ceux-ci serait une douleur ET encombrer le code terriblement. – Esaevian

+0

Vous pouvez définir votre classe comme dynamique, j'ai mis à jour ma réponse –

+0

Génial, qui a bien fonctionné (en mettant la classe à dynamique). – Esaevian

Questions connexes