gpt4 book ai didi

actionscript-3 - 在 AS3 中,removeEventListener(Event.ENTER_FRAME) 不起作用

转载 作者:行者123 更新时间:2023-12-04 04:29:42 25 4
gpt4 key购买 nike

我已经处理这个问题好几天了。我已经黔驴技穷了!
我似乎无法在任何论坛、文档等的任何地方找到明确的答案。

第一次运行时一切看起来都很好,或者当我加载下一个级别供用户玩时。但是如果用户按下 ESC 键来加载不同的关卡,ENTER FRAME 监听器不会被删除,它会复制其中的所有触发器,显示玩家的速度非常快,而且很时髦,因为它建立在之前的实例化 ENTER FRAME 监听器。

我不知道我是否有匿名函数的问题,或者在我的 removeEvent... 命令中引用了未知实例...底线,我放弃了,我需要这个有效的帮助!!!

这是代码:

function initPlay():void
{
//code here determining what display object to add to the list and assign it to the currentLevel variable (a movieclip)

if(userIsLoadingOtherLevel){
removeEnterFrameListener();
addChild(currentLevel);
}
if(userIsGointToNextLevel)
addChild(currentLevel);

currentLevel.addEventListener(Event.ENTER_FRAME, onEnterFrame);
function onEnterFrame(event:Event):void
{
//collision detection, parallax scrolling, etc, etc is done here.
if(allCoinsCollected)
loadNextLevel();
if(ESCKeyPressed)
ESCKeyPressHandler();
}
function loadNextLevel():void
{
removeChild(currentLevel);
newLevelToLoad++
removeEnterFrameListener();
initPlay();
}

function ESCKeyPressHandler():void
{
removeChild(currentLevel);
initPlay();
}
function removeEnterFrameListener();
{
currentLevel.removeEventListener(Event.ENTER_FRAME,onEnterFrame)
trace("currentLevel.hasEventListener(Event.ENTER_FRAME) = "+currentLevel.hasEventListener(Event.ENTER_FRAME)); //outputs TRUE if called from loadNextLevel but FALSE if called from initPlay() !!!
}
}

我还尝试将 eventListener 添加和删除到舞台、MovieClip(Root) 或什么都没有,结果总是相同的。

我知道可能有其他方法来设计这样一个过程,但请注意我目前在这样做时并不是很灵活,因为项目很长(大约 4000 行代码)并且以这种方式删除 ENTER FRAME,疯了或不应该仍然工作!

提前感谢任何愿意提供帮助的人。

最佳答案

问题似乎是 initPlay() 中的嵌套函数。方法。

每次调用initPlay()您正在定义 职能。其中一些嵌套函数调用 initPlay()他们自己。

函数是对象(内存引用)。所以每次调用initPlay()您正在对新功能进行新的引用。因此,当您尝试删除事件监听器时,您只能删除这些事件处理程序之一(当前执行范围内的事件处理程序)。

我不确定我是否清楚地解释了这一点,也许这个例子会有所帮助。我将使用数字来表示对每个函数的引用,以及一个与您类似的简单场景:

function example():void
{
addEventListener(MouseEvent.CLICK, mouseClickHandler);

function mouseClickHandler(event:Event):void
{
if (someCondition)
{
example();
}
else
{
removeEventListener(MouseEvent.CLICK, mouseClickHandler);
}
}
}

当我们第一次运行这个函数时,在 example() 范围内定义了一个新函数。功能。让我们使用数字 1 来表示对这个嵌套函数的引用。 someConditiontrue第一次,所以 example()再次调用函数。

在第二次执行 example()函数,创建对鼠标事件处理程序的新引用(#2)。我们还再次添加了事件监听器。此时,内存中有两个事件处理函数,都将在事件派发时执行。

假设在 example() 的第二次调用中那 someConditionfalse现在我们要删除监听器。当我们调用时:
removeEventListener(MouseEvent.CLICK, mouseClickHandler);

它指的是事件处理程序#2。事件处理程序 #1 仍然存在,因为它隐藏在第一次调用 example() 的范围内它不能在这里删除。

我的简单示例在此之后崩溃了......但我希望它能够清楚地说明为什么您的事件处理程序不应该嵌套在函数中。诚然,这很难描述,在像你这样的现实世界的例子中更是如此。但我非常有信心,这是您描述的大多数(如果不是全部)问题的根源。

关于actionscript-3 - 在 AS3 中,removeEventListener(Event.ENTER_FRAME) 不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18582767/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com