0

是否可以从一个类访问另一个类的事件处理程序,如果可以,如何访问?我想从对象中删除事件处理程序。我有两个对象说 objectA 和 objectB。在 objectA 内部,如何删除 objectB 的事件处理程序。这是我尝试过的,但它不起作用。

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

细节:

我有两个名为 Guest 和 Guest2 的课程。我想知道是否可以从 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

2 回答 2

0

笔记

没有两个类应该有完全相同的代码!

它完全没有达到类和对象的目的。

无论如何,如果代码确实不同,请努力在代码中实现继承。


回答

向类添加一个函数并调用它,以使其删除它自己的侦听器。就像是 :

public function removeListeners () {

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

并将其称为:

objectB.removeListeners();
于 2012-12-28T04:57:23.510 回答
0

在 objectA 中,您应该能够编写:

objectB.removeEventListener(MouseEvent.CLICK, ready);

您遇到的问题似乎是您无法获得对 objectB 的引用。我猜是因为您尝试使用“root”获取参考的方式。我建议在 objectA 的构造函数中传递对 objectB 的引用。

private var _objectB : ObjectB;

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

然后在需要时执行:

_objectB.removeEventListener(MouseEvent.CLICK, ready);

如果您仍然迷路,请发布更多代码。整个 objectA 和 objectB 类会很有帮助。

编辑:

在看到您的新细节后,我认为您需要重新考虑如何创建和管理客人的方法。拥有两个具有相同代码的类通常是个坏主意。在我看来,客人类之外的东西应该处理事件处理程序的添加和删除,创建客人的东西可能是一个很好的起点。

于 2012-12-27T23:53:26.937 回答