1

私はホルダームービークリップを持っています、その基本クラスはfooです。

package {
    import flash.display.MovieClip;

    public class Foo extends MovieClip {
        public function Foo() {
            trace("foo");
        }
    }
}

foo内には、基本クラスのbarを備えた他の多数のムービークリップがあります。

package {
    import flash.display.MovieClip;

    public class Bar extends MovieClip {
        public function Bar() {
            trace("bar");
        }
    }
}

バーのコンストラクターにトレースを入れて、正しくロードされているかどうかを確認します。fooをシーンにドラッグしてクリップを実行すると、その中のすべての小さなバーが正しく起動します。ただし、Mainクラスのように、動的にシーンに追加すると、次のようになります。

package {
    import flash.display.MovieClip;

    public class Main extends MovieClip {
        public function Main() {
            this.addChild(new Foo());
        }
    }
}

突然、foo内のすべての小さなバームービークリップが通常の古いムービークリップに戻り、起動しなくなります。興味深いのは、ある時点でそれらをBarとして型キャストし、それらの通常のクラスが(基本クラスではなく、ムービークリップ自体内で)Barに設定されている場合、それは機能し、コンストラクターはすべて次のように起動します。

    public function Main() {
        var foo:Foo = new Foo();
        stage.addChild(foo);
        foo.x = 0;
        foo.y = 0;

        trace(foo.getChildAt(1) as Bar);
    }//Main()

ただし、複数の異なるタイプのバークリップが必要で、それぞれに基本クラスのバーを指定する場合、これは機能しません。それらはすべて、一般的なムービークリップとして生成されます。またはのいずれかとしてタイプキャストすると機能しBar1ますBar2が、実際には、クリップをステージに追加するたびに、すべての子をすべてのトップレベルオブジェクトタイプとしてタイプキャストする必要があります。

また、Flashでは許可されていないため、同じタイプのムービークリップを多数持つことはできません。したがって、それぞれを新しいクラスにする必要があり、親がステージに配置されたときにそのクラスをタイプキャストする必要があります。一種のOOPの目的を打ち負かします。

これはFlash自体のバグのようですが、修正する方法はありますか?

4

1 に答える 1

1

問題は、Fooのクラスメンバーの宣言にあります。Flashで要素をMovieClipまたはSprite以外のものとしてインスタンス化する場合は、クラスにメンバー宣言を適切に追加するか、newキーワードを使用するときにタイプを宣言する必要があります。

これは機能します:

package {
import flash.display.MovieClip;
import flash.utils.describeType;

public class Foo extends MovieClip {
    public var bar1:Bar1;
    public var bar2:Bar2;
    public var bar3:Bar1;
    public var bar4:Bar2;

    public function Foo() {
        trace("foo", this.numChildren);

    }
}
}

クラスが実際に特別なことを何もしない場合は、ActionScriptプリファレンスを「ステージインスタンスを自動的に宣言する」に設定し、クラス宣言を省略することもできます。

JBossは型に対して非常に寛容ですが、コンパイラは、コード内で何らかの参照が見つかるまで、パネルで宣言された型を無視しているようです。おそらく、ライブラリのどこかでクラス名を消去し忘れた場合に、バイナリが誤って肥大化するのを防ぐためです。 。

于 2010-12-20T01:09:15.580 に答える