私はフラッシュプロジェクトに取り組んでいます。そこでは、たくさんのアートアセットを備えたswfがあります。ただし、それらはステージ上になく、単にライブラリ内にあり、私が作成したコードにリンクされています。
インスタンス化したいクラスが1つありますが、構築中に参照エラーが発生し続けます。
swf/flaライブラリの設定方法は次のとおりです
[MovieClip]ButtonPopup, Linkage:com.packagename.ButtonPopup
[MovieClip]popup_btn, Linkage: none
popup_btnはPopupの子であり、Flash CS5.5 IDE内で_popup_btn(Flash Builderによって生成されたpopup_btnと呼ばれるゲッターを使用)という名前が適切に付けられています。ポップアップクラスは次のとおりです。
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
}
}
}
私のメインのswfは次のようになります。
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);
}
悲しいことに、次の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]
Flash IDEでpopup_btnに名前を付けないままにしておくと、エラーは発生しませんが、MovieClipを参照できません(クリックリスナーなどを追加するため)。これは、問題のない解決策です。
誰かがここで何をすべきかについて何かアイデアがありますか?「複雑な」MovieClipをインスタンス化することはできませんが、代わりに各子のMovieClipを1つずつインスタンス化する必要がありますか?
編集:もう少しテストした後、問題のクラスがMovieClipから直接継承しているのではなく、別のクラス(MovieClipから継承している)から継承しているという事実に関係しているようです。それを反映するようにソースコードを更新しました。それが当てはまるかどうかはまだわかりません(MovieClipから継承しないと問題が発生します)。しかし、私たちは見るでしょう。
ありがとう、
-Esa