0

あるクラスから別のクラスにイベントハンドラーにアクセスすることは可能ですか?アクセスできる場合はどうすればよいですか?オブジェクトからイベントハンドラーを削除したい。objectAとobjectBという2つのオブジェクトがあります。objectAの内部で、objectBのイベントハンドラーを削除するにはどうすればよいですか。これは私が試したものですが、機能しません。

MovieClip(root).objectB.removeEventListener(MouseEvent.CLICK, ready);

詳細:

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

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

2 に答える 2

0

objectA 内から、次のように記述できるはずです。

objectB.removeEventListener(MouseEvent.CLICK, ready);

あなたが抱えている問題は、objectB への参照を取得できないことです。「ルート」を使用して参照を取得しようとしている方法が原因だと思います。objectA のコンストラクターで objectB への参照を渡すことをお勧めします。

private var _objectB : ObjectB;

public class ObjectA( objectBRef : ObjectB )
{
    _objectB = objectBRef;
}

そして、必要に応じて次のことを行います。

_objectB.removeEventListener(MouseEvent.CLICK, ready);

それでもわからない場合は、さらにコードを投稿してください。objectA および objectB クラス全体が役立ちます。

編集:

新しい詳細を確認した後、ゲストの作成および管理方法に対するアプローチを再考する必要があると思います. 同一のコードを持つ 2 つのクラスを持つことは、一般に悪い考えです。ゲスト クラスの外にある何かが、イベント ハンドラーの追加と削除を処理する必要があるように思えます。おそらく、ゲストを作成するところから始めるのがよいでしょう。

于 2012-12-27T23:53:26.937 に答える
0

ノート

2 つのクラスがまったく同じコードを持つべきではありません。

クラスとオブジェクトの目的に完全に失敗します。

とにかく、コードが異なる場合は、コードに継承を実装する努力をしてください。


答え

クラスに関数を追加して呼び出し、独自のリスナーを削除します。何かのようなもの :

public function removeListeners () {

    this.removeEventListener(MouseEvent.CLICK, ready);
}

そしてそれを次のように呼び出します:

objectB.removeListeners();
于 2012-12-28T04:57:23.510 に答える