AS3如何使用类B在类A中添加事件侦听器并使用类C删除相同的事件?

时间:2013-04-08 16:11:52

标签: actionscript-3 listener

这是AS3的问题。 我有类“addadd”,“Symbol1”(Button1),“Symbol2”(Button2)。 在“addadd”中我有3个功能。函数“StanishevFadd”创建对象并添加事件监听器,函数“stanishevFremove”删除事件监听器和函数“frameDOstanishev”,它将在添加事件时触发。 所以,我显然想要从Symbol1触发事件并从Symbol2停止相同的事件。不幸的是这种方式不起作用。我完全被困惑了。例如,如果我只想从Symbol1添加和删除事件侦听器 - YES有效,但我无法从Symbol1创建事件并从类addadd中的Symbol2中删除相同的事件。请帮帮我们!

public class addadd
{
    var stanishev:stanishev_line = new stanishev_line;

    public function addadd()
    {
    }

    public function stanishevFadd()
    {
        Main.display.addChild(stanishev);
        stanishev.gotoAndPlay("start");
        stanishev.addEventListener(Event.ENTER_FRAME, frameDOstanishev);
    }

    public function stanishevFremove()
    {
        stanishev.removeEventListener(Event.ENTER_FRAME, frameDOstanishev);
    }

    public function frameDOstanishev(e:Event)
    {
        trace (stanishev.currentFrame);
    }
}

// ------------------------------

public class Symbol1 extends SimpleButton
{
    var call_creator:addadd = new addadd;

    public function Symbol1()
    {
        // constructor code
        addEventListener(MouseEvent.MOUSE_OVER, eventResponse);
    }

    function eventResponse(e:MouseEvent)
    {
        call_creator.stanishevFadd();
    }
}   

// ----------------------

    public class Symbol2 extends SimpleButton
{
    var call_creator:addadd = new addadd;

    public function Symbol2()
    {
        // constructor code
        addEventListener(MouseEvent.MOUSE_DOWN, eventResponse2);
    }

    function eventResponse2(e:MouseEvent)
    {
        call_creator.stanishevFremove();
    }
}

2 个答案:

答案 0 :(得分:1)

好吧,我不确定这件事的整体目的是什么,所以我打算把这个东西叫做OddView。我将尝试接近你试图以更多OO方式做的事情。

我相信你应该可以在不涉及你的主类的情况下封装所有这些行为,并且有很多理由不涉及它,特别是not with static variables就像你正在做的那样。

public class OddView extends Sprite {
   protected var _btn1:SimpleButton;
   protected var _btn2:SimpleButton;
   protected var _stanishev:StanishevLine;//note I changed your Class name to be more in line with AS3 standards

   public function OddView() {
      super();
   }
   public function get btn1():SimpleButton {
       return _btn1;
   }
   public function set btn1(value:SimpleButton):void {
      if (value != _btn1) {
          if (_btn1) {
              removeEventListener(MouseEvent.MOUSE_OVER, goToState2);
          }
          _btn1 = value;
          if (_btn1) {
              _btn1.addEventListener(MouseEvent.MOUSE_OVER, goToState2);
          }
      }
   }
   public function get btn2():SimpleButton {
       return _btn2;
   }
   public function set btn2(value:SimpleButton):void {
      if (value != _btn2) {
          if (_btn2) {
              removeEventListener(MouseEvent.MOUSE_OVER, goToState1);
          }
          _btn2 = value;
          if (_btn2) {
              _btn2.addEventListener(MouseEvent.MOUSE_OVER, goToState1);
          }
      }
   }
   public function get stanishev():StanishevLine {
       return _stanishev;
   }
   public function set stanishev(value:StanishevLine):void {
       if (value != _stanishev) {
           if (_stanishev) {
              cleanUp(null);
           }
           _stanishev = value;
           initStanishev();
       }
   }
   public function initStanishev():void {
      if (_stanishev) {
         _stanishev.visible = true;
         _stanishev.goToAndPlay('start');
         addEventListener(Event.ENTER_FRAME, showStanishevFrame);
         addEventListener(Event.REMOVED_FROM_STAGE, cleanUp);
      }
   }
   public function goToState1(e:Event) :void {
       goToAndStop(1);
   }
   public function goToState2(e:Event):void {
       goToAndStop('State2');
   }
   public function showStanishevFrame(e:Event):void {
       if (stanishev) {
          trace('current frame', stanishev.currentFrame);
       }
   }
   public function cleanUp(e:Event):void {
      removeEventListener(Event.ENTER_FRAME, showStanishevFrame);
      removeEventListener(Event.REMOVED_FROM_STAGE, cleanUp);
   }
}

请注意,我假设您要将OddView应用为库符号的基类。我包括任何实例化或定位逻辑,因为我倾向于use the stage for those things

请注意,我检查舞台实例是否存在的原因是,理论上某人可能将OddView指定为基类,而不是在该库符号的舞台上放置btn1,btn2或stanishev。

然而,假设您要通过将btn1,btn2和stanishev放置在您希望它们所在的舞台上来处理这3个项目的视觉部分来编写此类。

另请注意,我强烈怀疑大部分内容完全没必要。很可能只需使用btn1的over状态即可处理大部分内容。但是,这并不能完全说明为什么你只想 删除事件监听器,而在btn2被cicked时不采取任何其他行动。因此,如果没有关于你实际想要完成的事情的真实信息,我就会“过度杀戮”。

有关编辑的说明
注意我在setter中正在做什么 - 如果已经存储了一个值,我们删除那个旧的,传出的,监听器上的监听器。然后,如果传入的值不为null,我们添加新的侦听器。

我仍然怀疑你不需要这么做,但考虑到你提供的信息,这应该有助于指明你正确的方向。

答案 1 :(得分:0)

您可以将stanishev类中的变量addadd设为静态变量。但是我不建议这样做,原因之一是你只能有一个stanishev个实例。希望@Amy Blankenship会告诉你如何完全重新设计你的程序,因为它需要重新设计。这种方法虽然有效,但您还应该向添加和删除eventListeners的函数添加条件,以查看stanishev是否已经有一个eventlistener或者没有。{/ p>

stanishev


public class addadd
{
public static var stanishev:stanishev_line = new stanishev_line;

public function addadd()
{
}

public function stanishevFadd()
{
    Main.display.addChild(stanishev);
    stanishev.gotoAndPlay("start");
    stanishev.addEventListener(Event.ENTER_FRAME, frameDOstanishev);
}

public function stanishevFremove()
{
    stanishev.removeEventListener(Event.ENTER_FRAME, frameDOstanishev);
}

public function frameDOstanishev(e:Event)
{
    trace (stanishev.currentFrame);
}
}


public class Symbol1 extends SimpleButton
{

public function Symbol1()
{
    // constructor code
    addEventListener(MouseEvent.MOUSE_OVER, eventResponse);
}

function eventResponse(e:MouseEvent)
{
    addadd.stanishev.stanishevFadd();
}
}