0

次のコードを使用して、ムービー クリップを動的に追加しました。

var apie=new cPie()
apie.x=100
apie.y=100
stage.addChild(apie)

今、ステージにパイがあります。うーん。これがドラッグ アンド ドロップでステージに配置されたムービー クリップのように機能すると仮定して、これを追加してパイ内のインスタンスを変更しました。

var apie=new cPie()
apie.x=100
apie.y=100
apie.cherry.gotoAndStop(2)
stage.addChild(apie)

チェリーは、3 フレームで構成される別のムービー クリップである cPie ムービー クリップのインスタンスです。2コマ目まで行きたいです。通常はこの方法で問題なく動作しますが、ActionScript を介して追加されたムービー クリップを使用しようとすると、次のランタイム エラーが発生します。

TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at pies_fla::MainTimeline/frame1()

いつものように、返されたエラーは、この問題の解決にはまったく役立ちません。それは「暗黙の強制」と同じくらいあいまいで、英語を専攻していない私には意味がありません. 私が知っていることは、何か間違ったことをしていて、その結果、このエラーが発生するということです。これについての正しい方法は非常に高く評価されます。

PSこれをループで使用する予定です。それを考慮してください。

4

2 に答える 2

0

エラーは行が原因だと思いますapie.cherry.gotoAndStop(2)。それを変更する必要があるかもしれませんがapie.getChildByName("cherry").gotoAndStop(2)、パイはムービークリップであるため、子はすぐにインスタンス化されないことがよくあります。

これを回避する方法は、フレームの再描画を待ってから MovieClip の子にアクセスすることです。

于 2011-04-11T09:20:42.630 に答える
0

そのエラーが発生した理由cherryは、オブジェクトのプロパティまたはメソッドではなく、表示オブジェクト コンテナーcPieの子表示オブジェクトのインスタンス名であるためです。表示オブジェクトcPieにアクセスするには、オブジェクトの継承メソッド、つまりメソッドを使用する必要があります。幸いなことに、これは frankhermes による別の回答ですでに説明されているため、次の例では、子表示オブジェクトにアクセスするための別の (そしておそらくより良い) アプローチを説明します。cherrycPieDisplayObjectContainergetChildByName()

CherryPie.as:

package display
{
    import flash.display.MovieClip;

    public class CherryPie extends MovieClip
    {
        private var _cherry:MovieClip;

        public function get cherry():MovieClip
        {
            return _cherry;

        }// end function

        public function CherryPie()
        {
            _cherry = cherryMC;

        }// end function

    }// end class

}// end package

Main.as:

package 
{
    import flash.display.Sprite;
    import flash.events.Event;

    public class Main extends Sprite 
    {
        public function Main():void 
        {
            init();

        }// end function

        private function init():void 
        {
            var cherryPie:CherryPie = new CherryPie();
            cherryPie.x = 100;
            cherryPie.y = 100;
            cherryPie.cherry.gotoAndStop(2);
            addChild(cherryPie);

        }// end function

    }// end class

}// end package

cherryPie_mcムービー クリップの基本クラスを作成することにより、 と呼ばれるプロパティを作成し、クラスの開始時に子表示オブジェクトをそれにcherry割り当てることができます。このようにして、次のような子表示オブジェクトcherryに直接アクセスできます。cherry

cherryPie.cherry.gotoAndStop(2);

とは対照的に:

cherryPie.getChildByName("cherryMC").gotoAndStop(2);

CherryPie次のように、クラスをcherryPie_mcムービー クリップの基本クラスとして設定できます。

注: シンボル プロパティの「名前」は「cherryPie_mc」である必要があります。 シンボル プロパティ

cherryまた、なぜ公有財産にしなかったのか疑問に思っている方へ

public var cherry:MovieClip;

代わりに getter メソッドを使用してプライベート プロパティにアクセスしました

private var _cherry:MovieClip;

public function get cherry():MovieClip
{
    return _cherry;

}// end function

セッターメソッドを省略してチェリーオブジェクトを読み取り専用にすることでした。読み取り専用にしたのは、次のようなことを避けるためです。

cherryPie.cherry = new FakeCherry();
于 2011-04-11T13:27:03.417 に答える