0

这是 AS3 的问题。我有类“addadd”、“Symbol1”(Button1)、“Symbol2”(Button2)。在“添加添加”中,我有 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();
    }
}
4

2 回答 2

1

好的,我不确定这整件事的总体目的是什么,所以我将把这件事称为 OddView。我将尝试以一种更面向对象的方式接近您正在尝试做的事情。

我相信你应该可以在不涉及主类的情况下封装所有这些行为,并且有很多理由不涉及它,尤其是不像你正在做的静态变量。

公共类 OddView 扩展 Sprite {
   受保护的 var _btn1:SimpleButton;
   受保护的 var _btn2:SimpleButton;
   protected var _stanishev:StanishevLine;//注意我把你的类名改成更符合AS3标准

   公共功能奇观(){
      极好的();
   }
   公共函数获取 btn1():SimpleButton {
       返回_btn1;
   }
   公共函数集 btn1(value:SimpleButton):void {
      如果(值!= _btn1){
          如果(_btn1){
              removeEventListener(MouseEvent.MOUSE_OVER, goToState2);
          }
          _btn1 = 价值;
          如果(_btn1){
              _btn1.addEventListener(MouseEvent.MOUSE_OVER, goToState2);
          }
      }
   }
   公共函数获取 btn2():SimpleButton {
       返回_btn2;
   }
   公共函数集 btn2(value:SimpleButton):void {
      如果(值!= _btn2){
          如果(_btn2){
              removeEventListener(MouseEvent.MOUSE_OVER, goToState1);
          }
          _btn2 = 价值;
          如果(_btn2){
              _btn2.addEventListener(MouseEvent.MOUSE_OVER, goToState1);
          }
      }
   }
   公共函数获取 stanishev():StanishevLine {
       返回_stanishev;
   }
   公共函数集 stanishev(value:StanishevLine):void {
       如果(值!= _stanishev){
           如果(_stanishev){
              清理(​​空);
           }
           _stanishev = 价值;
           初始化斯坦尼舍夫();
       }
   }
   公共函数 initStanishev():void {
      如果(_stanishev){
         _stanishev.visible =真;
         _stanishev.goToAndPlay('开始');
         addEventListener(Event.ENTER_FRAME, showStanishevFrame);
         addEventListener(Event.REMOVED_FROM_STAGE, cleanUp);
      }
   }
   公共函数goToState1(e:事件):无效{
       goToAndStop(1);
   }
   公共函数 goToState2(e:Event):void {
       goToAndStop('State2');
   }
   公共函数 showStanishevFrame(e:Event):void {
       如果(斯坦尼舍夫){
          跟踪(“当前帧”,stanishev.currentFrame);
       }
   }
   公共功能清理(e:事件):无效{
      removeEventListener(Event.ENTER_FRAME, showStanishevFrame);
      removeEventListener(Event.REMOVED_FROM_STAGE, cleanUp);
   }
}

请注意,我假设您将应用 OddView 作为库符号的基类。我包括任何实例化或定位逻辑,因为我倾向于将舞台用于这些事情

请注意,我在舞台实例上检查存在的原因是理论上有人可以将 OddView 分配为基类,而不是将 btn1、btn2 或 stanishev 放在该库符号的舞台上。

但是,编写本课程时假设您将通过将 btn1、btn2 和 stanishev 放置在您想要的舞台上来处理这 3 个项目的视觉部分。

另请注意,我强烈怀疑其中大部分是完全没有必要的。很可能您可以通过简单地使用 btn1 的 over 状态来处理大部分问题。但是,这并不能完全解释为什么您只想在 btn2 被选中时删除事件侦听器而不采取其他操作因此,在没有关于您实际要完成的工作的真实信息的情况下,我选择了“矫枉过正”。

注意编辑
注意我在 setter 中所做的事情——如果已经存储了一个值,我们将删除那个旧的、传出的监听器上的监听器。然后如果传入的值不为空,我们添加新的监听器。

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

于 2013-04-08T21:20:21.527 回答
0

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

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


public class Symbol2 extends SimpleButton
{

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

function eventResponse2(e:MouseEvent)
{
    addadd.stanishev.stanishevFremove();
}
}
于 2013-04-08T19:47:43.383 回答