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