stop語(yǔ)句的功能是停止當(dāng)前(this)動(dòng)畫(huà)的播放,停止在當(dāng)前幀。
但是有1些例外,使得動(dòng)畫(huà)所停止的位置并非執(zhí)行stop語(yǔ)句所在的幀位置。如在第1幀運(yùn)行stop,可能會(huì)停在第2幀。
以下例子:
建立1個(gè)空f(shuō)la文件,在第1幀寫(xiě):
trace(_currentframe);//顯示所在幀的位置。
在第7幀插入1個(gè)空關(guān)鍵幀,寫(xiě)下如下代碼:
this.onEnterFrame=function (){
this.gotoAndPlay(2);
this.onEnterFrame=undefined;
trace("enterFrame");
}
這些語(yǔ)句使動(dòng)畫(huà)跳轉(zhuǎn)到第2幀。
完成后在flash ide中測(cè)試該文件,首先output面板中顯示
1
這時(shí)flash停在第1幀,是正確的;然后按下回車(chē),使主場(chǎng)經(jīng)動(dòng)畫(huà)繼續(xù)播放,這時(shí),在output面板中顯示的是
1
enterframe
2
如果將第7幀中的goto改稱(chēng)this.gotoAndPlay(3),output面板中就會(huì)顯示3.
這是stop語(yǔ)句的bug,使得動(dòng)畫(huà)停在錯(cuò)誤的位置。究其原因,其實(shí)都是事件處理函數(shù)引起的,純粹的幀AS不會(huì)出現(xiàn)這種問(wèn)題。
問(wèn)題出現(xiàn)的地方從第7幀開(kāi)始,這1幀中,我們?cè)O(shè)置了1個(gè)onEnterFrame函數(shù),并在函數(shù)的*刪除的函數(shù)自己,他的功能是使得函數(shù)體只執(zhí)行1次,而且,onEnterFrame函數(shù)被設(shè)置后不會(huì)馬上執(zhí)行,下1幀才會(huì)起作用,所以,這段as的功能也是延遲1幀執(zhí)行某些操作(很多AS代碼中都用到了這個(gè))。
所以,當(dāng)動(dòng)畫(huà)再回到第1幀時(shí),flash要執(zhí)行2部分代碼,1個(gè)是onEnterFrame得函數(shù)體,1個(gè)是幀代碼。但通常,幀代碼是在事件處理代碼后面執(zhí)行的,第1幀的所有代碼就為:
stop();
而且,as的運(yùn)行方法是先把所有的代碼放入1個(gè)隊(duì)列,然后逐次運(yùn)行。所以,雖然首先跳轉(zhuǎn)到了第2幀,但第1幀的stop仍然會(huì)執(zhí)行,以致*的結(jié)果就是停在了第2幀。
這個(gè)bug也由其他的事件處理函數(shù)引起,如onKeyDown等。產(chǎn)生這個(gè)問(wèn)題的根本原因就是stop所在的幀位置和當(dāng)前實(shí)際的幀位置不同。也就是說(shuō),_currentframe屬性和stop語(yǔ)句的幀位置不同,所以,我們可以通過(guò)判斷_currentframe屬性的值來(lái)避免這個(gè)bug。
當(dāng)flash執(zhí)行晚onEnterFrame中的this.gotoAndPlay(2)時(shí),_currentframe已經(jīng)被指定為2,這個(gè)是正確的,只需將第1幀
語(yǔ)句改稱(chēng):
就可以避免stop停止在錯(cuò)誤的位置。根據(jù)需要,也可以改成:
即,無(wú)論在什么地方,都回到第1幀并停止。