eventListeners不会离开

时间:2015-06-19 21:15:59

标签: actionscript-3 flash event-listener

这是我的框架的最后两行动作脚本:

removeListeners();
if(!stage.hasEventListener(Event.ENTER_FRAME)){trace("STAGE HAS NO eventListeners");}

之前已将removeListeners()函数描述为:

function removeListeners(){
    if(button){
        button.removeEventListener(MouseEvent.CLICK,leaveGameScene);        
    }
    stage.removeEventListener(Event.ENTER_FRAME,menuOnFrame);
    stage.removeEventListener(Event.ENTER_FRAME,collectDrachmas);
    stage.removeEventListener(Event.ENTER_FRAME,updateHealth);
    stage.removeEventListener(Event.ENTER_FRAME,updateCards);
    stage.removeEventListener(Event.ENTER_FRAME,updateQuestions);
    stage.removeEventListener(Event.DEACTIVATE,stageDeactivate);
    stage.removeEventListener(KeyboardEvent.KEY_DOWN,key_down);
    stage.removeEventListener(KeyboardEvent.KEY_UP,key_up);
    stage.removeEventListener(Event.ENTER_FRAME,charEnterFrame);
    stage.removeEventListener(Event.ENTER_FRAME,updateInteractives);
    stage.removeEventListener(Event.ENTER_FRAME,onFrameBadguy);
    stage.removeEventListener(Event.ENTER_FRAME,onFrameStage);
    stage.removeEventListener(Event.ENTER_FRAME,updateConversations);
    stage.removeEventListener(Event.ENTER_FRAME,updatePit);
    //etc etc etc

}

从而彻底删除整个项目中出现的任何可能的现有eventListener。我们知道没有多次添加eventListeners,因为下面给出了原因,并且因为所有现有的eventListener在退出帧时都以此代码终止。

通过我的项目的所有eventListeners都被简单地声明,并且没有添加到其他函数或类似的东西中(如下所示),因此消除了由于具有多个相同的eventListeners而导致此问题的可能性:

stage.addEventListener(Event.ENTER_FRAME,updateHealth);

当我的帧的动作脚本的最后两行被执行时,Flash表现得好像舞台上绝对没有ENTER_FRAME eventListeners,顽固地追踪

"STAGE HAS NO eventListeners"

相应。但是,在运行此帧上的代码之后,将运行已在前一帧上声明的阶段的多个ENTER_FRAME eventListeners(这会导致多个错误,因为当前正在调用空对象)! eventListener似乎重新出现在没有原因和没有原因的地方。这怎么可能?什么可能是这个问题的根源?

也许我应该提一下,我使用完全相同的方法和一个按钮前进到这个框架没有麻烦。两种方式都以:

结束
removeListeners();
gotoAndPlay(1,"Menu");

更新

以下是给出的错误:

TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at _109_fla::MainTimeline/collectDrachmas()[_109_fla.MainTimeline::frame1:369]
TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at _109_fla::MainTimeline/updateHealth()[_109_fla.MainTimeline::frame1:417]
TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at _109_fla::MainTimeline/updateQuestions()[_109_fla.MainTimeline::frame1:592]
TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at _109_fla::MainTimeline/updateCards()[_109_fla.MainTimeline::frame1:810]
TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at _109_fla::MainTimeline/charEnterFrame()[_109_fla.MainTimeline::frame1:978]
TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at _109_fla::MainTimeline/updateInteractives()[_109_fla.MainTimeline::frame1:1892]
TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at _109_fla::MainTimeline/onFrameBadguy()[_109_fla.MainTimeline::frame1:2015]
TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at _109_fla::MainTimeline/onFrameStage()[_109_fla.MainTimeline::frame1:2638]
TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at _109_fla::MainTimeline/updateConversations()[_109_fla.MainTimeline::frame1:2760]

由于各自函数中的以下eventListeners,会发生这些错误:

function collectDrachmas(e:Event)
function updateHealth(e:Event)
function updateCards(e:Event)
function charEnterFrame(e:Event)
function updateInteractives(e:Event)
function onFrameBadguy(e:Event)
function onFrameStage(e:Event)
function updateConversations(e:Event)

1 个答案:

答案 0 :(得分:1)

我无法了解你的问题。但这是我对它的理解。

  1. stage是一个全局对象。因此,无论何时何地向该对象添加eventlistener,它都会侦听同一个对象。所以要小心。
  2. 对同一个对象使用不同的函数也是一个坏主意。
  3. 根据我的经验,Enterframe是一件令人讨厌的事。
  4. 只有在将显示对象添加到舞台后,才能访问 stage 全局。这意味着如果您打算在类构造函数中使用stage对象,则最有可能会抛出null错误。这意味着我们在您可以使用之前访问该对象。因此,在您的情况下,您可能会尝试访问舞台对象,然后才能使用它。
  5. 请分享更多代码,以便我们了解最新情况。那么我们绝对可以帮助你。