对基于帧的对象的无效引用

有时 gotoAndStop() 在代码中间调用,引用一些基于帧的属性。但是,**在更改帧之后,**所有当前帧上存在的属性的链接都将失效,因此任何涉及它们的处理都应立即终止。

这种处理有两种一般情况:首先,在 gotoAndStop() 调用之后循环不会结束,如下所示:

for each (bullet in bullets) {
    if (player.hitTestObject(bullet)) gotoAndStop("gameOver");
}

这里,1009 错误意味着 player MC 在处理 gotoAndStop() 调用时被破坏,但循环继续,并引用 now-null 链接从中获取 hitTestObject()。如果条件会改为 if (bullet.hitTestObject(player)),则错误将是#2007“参数 hitTestObject 不能为空”。解决方案是在调用 gotoAndStop() 之后立即发表一个 return 声明。

第二种情况是同一事件上的多个事件侦听器。像这样:

stage.addEventListener(Event.ENTER_FRAME,func1);
stage.addEventListener(Event.ENTER_FRAME,func2);
function func1(e:Event):void {
    if (condition()) {
        gotoAndStop(2);
    }
}

这里,如果 condition() 为 true,则第一个侦听器将执行 gotoAndStop(),但第二个侦听器仍将被执行,如果该侦听器引用该帧上的对象,则将抛出 1009 错误。解决方案是避免单个事件上的多个侦听器,在单个对象中,最好有一个侦听器处理该事件的所有情况,并且如果需要更改帧,则可以正确终止。