eventListeners 不会离开
eventListeners Won't Leave
这些是我框架的最后两行动作脚本:
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 被多次添加,因为下面给出的原因以及因为所有现有的 eventListeners 在退出框架时都用此代码终止。
我项目中的所有 eventListeners 都只是简单地声明,不会添加到其他函数或类似的东西中(如下所示),因此消除了由于具有多个相同的 eventListeners 而导致此问题的可能性:
stage.addEventListener(Event.ENTER_FRAME,updateHealth);
当我的框架的动作脚本的最后两行被执行时,Flash 就好像舞台上完全没有 ENTER_FRAME 事件监听器一样,固执地跟踪
"STAGE HAS NO eventListeners"
因此。但是,在 运行 完成此帧上的代码后,该阶段的多个 ENTER_FRAME 事件监听器是 运行 已在前一帧上声明的(这会导致多个错误,因为当前空对象是被召唤)! 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)
我不知道你的问题。但这是我对此的理解。
- stage 是一个全局对象。因此,无论何时何地,您向该对象添加事件监听器时,它都会监听同一个对象。所以要关心它。
- 对同一对象的同一事件也使用不同的函数是个坏主意。
- 根据我的经验,Enterframe 是一件令人讨厌的事情。
- 只有在将显示对象添加到舞台后,代码才能访问 stage 全局。这意味着如果您打算在 class 构造函数中使用 stage 对象,它很可能会抛出空错误。这意味着我们在对象可用之前访问它。因此,在您的情况下,您可能会在 stage 对象可用之前尝试访问它。
请分享更多代码,以便我们了解发生了什么。那么我们绝对可以在这方面帮助您。
这些是我框架的最后两行动作脚本:
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 被多次添加,因为下面给出的原因以及因为所有现有的 eventListeners 在退出框架时都用此代码终止。
我项目中的所有 eventListeners 都只是简单地声明,不会添加到其他函数或类似的东西中(如下所示),因此消除了由于具有多个相同的 eventListeners 而导致此问题的可能性:
stage.addEventListener(Event.ENTER_FRAME,updateHealth);
当我的框架的动作脚本的最后两行被执行时,Flash 就好像舞台上完全没有 ENTER_FRAME 事件监听器一样,固执地跟踪
"STAGE HAS NO eventListeners"
因此。但是,在 运行 完成此帧上的代码后,该阶段的多个 ENTER_FRAME 事件监听器是 运行 已在前一帧上声明的(这会导致多个错误,因为当前空对象是被召唤)! 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)
我不知道你的问题。但这是我对此的理解。
- stage 是一个全局对象。因此,无论何时何地,您向该对象添加事件监听器时,它都会监听同一个对象。所以要关心它。
- 对同一对象的同一事件也使用不同的函数是个坏主意。
- 根据我的经验,Enterframe 是一件令人讨厌的事情。
- 只有在将显示对象添加到舞台后,代码才能访问 stage 全局。这意味着如果您打算在 class 构造函数中使用 stage 对象,它很可能会抛出空错误。这意味着我们在对象可用之前访问它。因此,在您的情况下,您可能会在 stage 对象可用之前尝试访问它。
请分享更多代码,以便我们了解发生了什么。那么我们绝对可以在这方面帮助您。