2

私はフラッシュプロジェクトに取り組んでいます。そこでは、たくさんのアートアセットを備えた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

4

1 に答える 1

1

2つの解決策があります:クラスを動的として設定します:

public dynamic class ButtonPopup extends Popup

そうすれば、フラッシュエラーは発生しません

また

ButtonPopupクラスに「_popup_btn」(SimpleButtonまたはMovieClipで入力)という名前のパブリック変数を作成する必要があります。そうすると、Flashはこの変数をpopup_btnのインスタンスに設定します。

于 2012-08-17T10:10:48.277 に答える