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
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
Vous pouvez définir votre classe comme dynamique, j'ai mis à jour ma réponse –
Génial, qui a bien fonctionné (en mettant la classe à dynamique). – Esaevian