我已经处理这个问题好几天了。我已经黔驴技穷了!我似乎无法在任何论坛、文档等的任何地方找到明确的答案。
第一次运行时一切看起来都很好,或者当我加载下一个级别供用户玩时。但是如果用户按下 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,疯了或不应该仍然工作!
提前感谢任何愿意提供帮助的人。