1

AS3 ドキュメント クラスでこのコードを使用して、ステージからすべてのオブジェクトを削除しました。

var _stage:DisplayObjectContainer = stage as DisplayObjectContainer;
while (_stage.numChildren > 0) {
    _stage.removeChildAt(0);
}

これは、1 つの例外を除いて非常にうまく機能しているようです。これを実行した後、ボタンを押してすべてをステージに再ロードできます。この構築関数では、ステージのイベント リスナーがまだ存在しない場合にそれらを作成するために、いくつかの条件が追加されます。

if(!stage.hasEventListener(KeyboardEvent.KEY_DOWN));
    stage.addEventListener(KeyboardEvent.KEY_DOWN, handle_key);
if(!stage.hasEventListener(MouseEvent.MOUSE_MOVE));
    stage.addEventListener(MouseEvent.MOUSE_MOVE, manage_cursor);   

編集:ステージは間違いなくnullif(stage){}です。コードのこのセクションを配置すると、ステージが使用されるコードの次のポイントでエラーが発生します

TypeError: Error #1009: Cannot access a property or method of a null object reference.ただし、 「ステージ」に関して、再構築時にエラーが発生します。

さらなる調査により、ステージからすべての DisplayObject を削除すると、DisplayObject が追加されるまでステージ自体にアクセスできなくなる可能性があることが示されています。続行。

どんな助けでも大歓迎です。

4

1 に答える 1

2

MovieClip内から「ステージ」を呼び出す場合、MovieClipがディスプレイリストにある場合にのみ、参照はnull以外になります。ステージは、Flashが読み込まれると常に存在しますが、個々のMovieClipインスタンスは、表示リストに追加/削除されたときに、ステージへの参照を取得/喪失できます。

これは、ドキュメントルートインスタンスにも当てはまります。DisplayObjectがディスプレイリストから削除されるとすぐに、そのステージ参照はnullに設定されます。

概念を説明するルートドキュメントを使用した例を次に示します。

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

    [SWF(width="800", height="600", frameRate="60"]
    public class Main extends Sprite
    {
        public function Main()
        {
            addEventListener(Event.ENTER_FRAME, onEnterFrame, false, 0, true);
        }

        private function onEnterFrame(event:Event):void
        {
            if (stage != null)
            {
                trace("stage: "+stage);
                stage.removeChild(this);
                trace("stage: "+stage);

               removeEventListener(Event.ENTER_FRAME, onEnterFrame);
            }
        }
    }
}

このコードは次のように出力します。

stage: [object Stage]
stage: null

表示リストからオブジェクトを削除した後、ステージ参照が失われることに注意してください。

あなたの例では、ステージのすべての子をループし、それぞれを削除しています。上記と同じ概念のため、ステージ参照が失われることは間違いありません。

于 2012-01-09T22:01:11.563 に答える