-2

Guest と Guest2 という 2 つのクラスがあります。Guest2クラスからGuestクラスのイベントリスナーを削除できるかどうか知りたいです。以下は完全なコードです。注: 両方のクラスのコードはまったく同じです

package 
        {
    import flash.display.MovieClip;
        import flash.events.Event;
        import flash.events.MouseEvent;
        import flash.filters.*;

        public class Guest extends MovieClip
        {
            var walkSpeed:Number = 5;
            var oldPosX;
            var oldPosY;

            var myGlow:GlowFilter = new GlowFilter();

            public function Guest()
            {   
                addEventListener(MouseEvent.MOUSE_OVER, addGlow);
            }

            function addGlow(event:MouseEvent):void
            {
                filters = [myGlow];
                addEventListener(MouseEvent.MOUSE_OUT, removeGlow);
                addEventListener(MouseEvent.CLICK, ready);

            }

            function removeGlow(event:MouseEvent):void
            {
                filters = [];
            }

            function ready(event:MouseEvent):void
            {
                filters = [myGlow];
                stage.addEventListener(MouseEvent.MOUSE_DOWN, walk);
                removeEventListener(MouseEvent.MOUSE_OUT, removeGlow);
                **MovieClip(root).Guest02.addEventListener(MouseEvent.CLICK, walkTo);**
            }

            function walk(event:MouseEvent):void
            {
                oldPosX = parent.mouseX;
                oldPosY = parent.mouseY;
                rotation = Math.atan2(oldPosY - y,oldPosX - x) / Math.PI * 180;
                filters = [];
                stage.removeEventListener(MouseEvent.MOUSE_DOWN, walk);
                stage.addEventListener(Event.ENTER_FRAME, loop);
            }

            function loop(event:Event):void
            {
                var dx:Number = oldPosX - x;
                var dy:Number = oldPosY - y;
                var distance:Number = Math.sqrt((dx*dx)+(dy*dy));
                if (distance<walkSpeed)
                {
                    // if you are near the target, snap to it
                    x = oldPosX;
                    y = oldPosY;
                    removeEventListener(Event.ENTER_FRAME, loop);

                }
                else
                {
                    x = x+Math.cos(rotation/180*Math.PI)*walkSpeed;
                    y = y+Math.sin(rotation/180*Math.PI)*walkSpeed;
                }

            }

            **function walkTo(event:MouseEvent):void
            {
                _Guest02.removeEventListener(MouseEvent.CLICK, ready);
            }**

        }
    } 
4

1 に答える 1

0

Jake King が既に指摘したように、オブジェクト指向プログラミングの観点からコードを見直したいと思うかもしれません。両方のクラスがまったく同じ機能を共有しているという場合は、クラス Guest をセットアップして、2 つのインスタンス (例: guest1 と guest2) を作成してみませんか。

イベントハンドラーに関する質問については、パブリックであり、別のインスタンスからアクセスできるインスタンス変数にリスナーを格納する (悪いスタイル) か、リスナーの削除を可能にする専用のパブリック関数を作成する必要があります。 、リスナー変数は非公開のままです。

public class Guest extends MovieClip
{
    private var overListener;

    public function Guest()
    {   
        overListener = addEventListener(MouseEvent.MOUSE_OVER, addGlow);
    }

    public function removeOverListener() 
    {
        if (overListener) {
            removeEventListener(MouseEvent.MOUSE_OVER, overListener);
        }
    }

    ...
}

ゲスト 1 とゲスト 2 の両方がゲストのインスタンスであり、ゲスト 1 にゲスト 2 への参照が保存されている場合、次のようにゲスト 1 からゲスト 2 のリスナーを削除できます。

guest2.removeOverListener();
于 2012-12-28T14:10:34.003 に答える