【问题标题】:How to access an event handler from one class to another class (Part 2) as3如何从一个类访问事件处理程序到另一个类(第 2 部分)as3
【发布时间】:2012-12-28 01:29:01
【问题描述】:

我有两个类,分别称为 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);
            }**

        }
    } 

【问题讨论】:

  • "两个类的代码完全相同。"从你最后两个问题和那个陈述来看,我开始觉得你对类和实例的角色有点不清楚。为什么你有两个完全一样的代码?
  • @Jake King:我有 2 个具有相同代码的类的原因是因为我有 8 个来宾,它们的功能都相同,但出于原型原因使用了两个,而不是在数组中或创建一个单独的课程,所有人都可以访问我做了很长的路要走,所以我自己对我正在编码的内容有充分的了解。两位客人都可以互相交谈,所以我知道我需要一个布尔值,但现在我想知道现在是否可以从其他类中删除事件侦听器,然后我将处理数组和 for 循环以使其高效.

标签: actionscript-3


【解决方案1】:

正如 Jake King 已经指出的那样,您可能希望从面向对象编程的角度重新审视您的代码。如果你说两个类共享完全相同的功能,为什么不设置一个类 Guest 并创建两个实例,例如来宾 1 和来宾 2。

至于您关于事件处理程序的问题,您需要将侦听器存储在一个公共实例变量中,然后可以从另一个实例访问(不好的样式),或者编写一个允许删除的专用公共函数一个监听器,而监听器变量是私有的:

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);
        }
    }

    ...
}

如果 guest1 和 guest2 都是 Guest 的实例,并且 guest1 存储了对 guest2 的引用,那么您可以像这样从 guest1 中删除 guest2 中的侦听器:

guest2.removeOverListener();

【讨论】:

  • 我明白你在说什么。我将其保留为不同课程的另一个原因是,每个课程都有不同的特征、爱好、兴趣和不同的数据存储。我有 8 位客人。解决这个问题的最佳方法是什么。我是否应该创建一个单独的班级,所有 8 位客人/班级都可以访问它并相互访问。
  • 请查看面向对象开发的基础知识,例如here。它很可能会解决您在具体项目中面临的问题。
  • @Saf 您正在尝试做的事情(让来宾的每个实例都能够相互访问)被认为是一种不好的模式,因为它会将您的类耦合在一起,使它们无法作为个人回收。您想要做的是有一些更高级别的经理类型类来处理每个客人之间的关系。至于你的类本身,你走在正确的轨道上,但在继续你的项目之前,你应该阅读 ActionScript 3 中的类继承。
  • 好的,所以对于代码的移动端,我应该在所有 8 个来宾/班级都可以访问的不同班级上进行。我是否也应该使用数组来选择和说话。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-11
  • 1970-01-01
相关资源
最近更新 更多