對基於幀的物件的無效引用

有時 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 錯誤。解決方案是避免單個事件上的多個偵聽器,在單個物件中,最好有一個偵聽器處理該事件的所有情況,並且如果需要更改幀,則可以正確終止。