Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 AS3如何使用类B在类A中添加事件侦听器,并使用类C删除相同的事件?_Actionscript 3_Listener - Fatal编程技术网

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

Actionscript 3 AS3如何使用类B在类A中添加事件侦听器,并使用类C删除相同的事件?,actionscript-3,listener,Actionscript 3,Listener,这是一个问题。 我有一个类“addadd”,“Symbol1”(按钮1),“Symbol2”(按钮2)。 在“add”中,我有3个函数。函数“StanishevFadd”创建对象并添加事件侦听器,“stanishevFremove”函数删除事件侦听器,函数“frameDOstanishev”将在添加事件时触发。 显然,我想从Symbol1触发事件,并从Symbol2停止相同的事件。不幸的是,这种方式不起作用。我完全糊涂了。例如,如果我只想从Symbol1添加和删除事件侦听器-YES可以工作,但我

这是一个问题。 我有一个类“addadd”,“Symbol1”(按钮1),“Symbol2”(按钮2)。 在“add”中,我有3个函数。函数“StanishevFadd”创建对象并添加事件侦听器,“stanishevFremove”函数删除事件侦听器,函数“frameDOstanishev”将在添加事件时触发。 显然,我想从Symbol1触发事件,并从Symbol2停止相同的事件。不幸的是,这种方式不起作用。我完全糊涂了。例如,如果我只想从Symbol1添加和删除事件侦听器-YES可以工作,但我无法从Symbol1创建事件,也无法在ADDDAD类中从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();
    }
}
//----------------------

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

您可以将变量
stanishev
设置为
add
a类静态变量。但是我不建议这样做,原因之一是您只能有一个
stanishev
实例。希望@Amy Blankenship能告诉你如何完全重新设计你的程序,因为它需要重新设计。不过,这种方法会起作用,您还应该在函数中添加条件,以便将eventlistener添加和删除到
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);
}
}



好吧,我不确定这整件事的总体目的是什么,所以我将这件事称为OddView。我将试着以一种更糟糕的方式接近你想要做的事情

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

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扩展了Sprite{ 受保护变量btn1:SimpleButton; 受保护变量btn2:SimpleButton; 受保护的var _stanishev:StanishevLine;//注意,我更改了您的类名,使之更符合AS3标准 公共功能视图(){ 超级(); } 公共函数get btn1():SimpleButton{ 返回_btn1; } 公共函数集btn1(值:SimpleButton):无效{ 如果(值!=\u btn1){ 如果(_btn1){ 移除EventListener(MouseEvent.MOUSE_OVER,goToState2); } _btn1=数值; 如果(_btn1){ _btn1.addEventListener(MouseEvent.MOUSE_OVER,goToState2); } } } 公共函数get btn2():SimpleButton{ 返回_btn2; } 公共函数集btn2(值:SimpleButton):无效{ 如果(值!=\u btn2){ 如果(_btn2){ removeEventListener(MouseEvent.MOUSE_OVER,goToState1); } _btn2=数值; 如果(_btn2){ _btn2.addEventListener(MouseEvent.MOUSE_OVER,goToState1); } } } 公共函数get stanishev():StanishevLine{ 返回(u stanishev);; } 公共函数集stanishev(值:StanishevLine):无效{ 如果(值!=\u stanishev){ 如果(_stanishev){ 清除(空); } _stanishev=值; initStanishev(); } } 公共函数initStanishev():void{ 如果(_stanishev){ _stanishev.visible=true; _stanishev.goToAndPlay(“开始”); addEventListener(Event.ENTER_FRAME,showstanishvframe); addEventListener(Event.REMOVED_FROM_STAGE,cleanUp); } } 公共功能goToState1(e:事件):无效{ goToAndStop(1); } 公共功能goToState2(e:事件):无效{ goToAndStop(“状态2”); } 公共功能showStanishevFrame(e:事件):无效{ 如果(斯坦尼舍夫){ 跟踪(“当前帧”,stanishev.currentFrame); } } 公共函数清理(e:事件):无效{ removeEventListener(Event.ENTER_FRAME,showstanishvframe); removeEventListener(Event.REMOVED_从_阶段,清理); } } 请注意,我假设您将应用OddView作为库符号的基类。我不包括任何实例化或定位逻辑,因为我倾向于

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

但是,编写这个类的前提是,假设您要通过将btn1、btn2和stanishev放置在您希望的舞台上来处理这3个项目的可视部分

还要注意的是,我强烈怀疑这其中的大部分是完全没有必要的。很有可能,您可以通过简单地使用btn1的过状态来处理大部分问题。然而,这并不能完全解释为什么您只想删除事件侦听器,而不想在btn2被循环时采取其他操作。所以我选择了“过度杀戮”,因为没有关于你真正想要完成什么的真实信息

编辑说明
请注意我在setter中所做的工作——如果已经存储了一个值,我们将删除旧的传出侦听器上的侦听器。然后,如果传入值不为null,则添加新的侦听器


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

您目前的设计存在着比您提出的问题更大的问题。在我看来,最好的答案是告诉你如何完全重新设计整个东西,但我不会花时间去打印这个答案,除非你愿意。是吗?如果你告诉我如何重新设计这个,我会很高兴的。谢谢谢谢艾米。你太棒了。现在我要拼出你的代码:)。它看起来更整洁:)。我对AS3非常陌生,我仍然很喜欢:)老实说,我认为学习这门语言最大的挑战是围棋