1

そのため、プログラムでメインタイムラインにムービークリップオブジェクトを追加しています。これらのムービークリップでは、タイマーイベントを使用しているため、ステージに追加されると移動します。

したがって、ゲームが終了したら、ムービークリップオブジェクトをステージから削除したいのですが、これは実行できますが、オブジェクトのリスナーがまだそこにあるため、エラーが発生します。

メインタイムラインからムービークリップオブジェクトタイムラインのコードにアクセスしてリスナーを削除できません。また、ムービークリップタイムラインでリスナーを削除する方法がわかりません。

これが理にかなっていることを願っています!

ヘルプ!

4

2 に答える 2

1

MovieClip は Event.REMOVED_FROM_STAGE をリッスンして、以前に追加したすべてのイベント リスナーをプログラムで削除できます。これがどのように行われるかを示すサンプルコードを次に示します。

    // add this code to an ActionScript class that extends Sprite
    // call initClips() in the constructor

    private var _clipA:MovieClip;
    private var _clipB:MovieClip;
    private var _clipACount:int;
    private var _clipBCount:int;

    private function initClips():void
    {
        // create 2 movieclips and add some common event listeners
        _clipA = new MovieClip();
        _clipA.addEventListener(Event.ADDED_TO_STAGE, onClipAddedToStage);
        _clipA.addEventListener(Event.REMOVED_FROM_STAGE, onClipRemovedFromStage);
        _clipA.addEventListener(Event.ENTER_FRAME, onEnterFrameClipA);


        _clipB = new MovieClip();
        _clipB.addEventListener(Event.ADDED_TO_STAGE, onClipAddedToStage);
        _clipB.addEventListener(Event.REMOVED_FROM_STAGE, onClipRemovedFromStage);
        _clipB.addEventListener(Event.ENTER_FRAME, onEnterFrameClipB);

        _clipACount = 0;
        _clipBCount = 0;

        addChild(_clipA);
        addChild(_clipB);
    }



    private function onClipAddedToStage(event:Event):void
    {
        var clip:MovieClip = event.currentTarget as MovieClip;
        if(clip == _clipA)
        {
            // position movieclip to dummy values
            clip.x = 40;
            clip.y = 40;
        }
        else if(clip == _clipB)
        {
            clip.x = 200;
            clip.y = 100;
        }
    }

    private function onClipRemovedFromStage(event:Event):void
    {
        var clip:MovieClip = event.currentTarget as MovieClip;
        // good habit to null check in case "as" casting fails
        if(clip != null)
        {
            // remove event listeners for this movieclip instance
            clip.removeEventListener(Event.ADDED_TO_STAGE, onClipAddedToStage);
            clip.removeEventListener(Event.REMOVED_FROM_STAGE, onClipRemovedFromStage);

            // there is no penalty for trying to remove event listeners that were not added to this object instance
            clip.removeEventListener(Event.ENTER_FRAME, onEnterFrameClipA); 
            clip.removeEventListener(Event.ENTER_FRAME, onEnterFrameClipB);
        }
    }


    private function onEnterFrameClipA(event:Event):void
    {
        _clipACount++;
        trace("onEnterFrame for clipA " + _clipACount);

        if(_clipACount > 10)
        {
            // for demonstration purposes
            // remove self after a few frames pass
            removeChild(_clipA);
        }

    }   

    private function onEnterFrameClipB(event:Event):void
    {
        _clipBCount++;
        trace("onEnterFrame for clipB " + _clipBCount);

        if(_clipBCount > 20)
        {
            removeChild(_clipB);
        }
    }   
于 2014-06-05T08:08:58.473 に答える
0

DisplayObject がステージから削除されたときに、通知を受け取るイベントがあります。Event.ADDED、Event.ADDED_TO_STAGE、Event.REMOVED、および Event.REMOVE_FROM_STAGE のリスナーをセットアップして、MovieClip のライブ サイクルを実装するだけです。MovieClips が追加されたら開始します。MovieClip が削除されたときに、リスナーを削除したり、タイマーを停止したりします。

于 2012-12-20T10:47:46.587 に答える