[AS3]控制上層影片片段的語法
早期AS2時MovieClip類別是主角,用MovieClip一套打天下,當要存取上層影片片段或主時間軸,通常使用parent和root就可以搞定。但如果在AS3直接使用MovieClip類別的屬性或方法(像root.gotoAndPlay(5)),這樣就會發生錯誤。
原因在於AS3將類別做更細部的區分,分成以下幾個有繼承關係的類別:
parent的資料類型為顯示物件容器:DisplayObjectContainer
root的資料類型為顯示物件:DisplayObject
所以我們常使用到的parent,root跟MovieClip是不一樣的資料類型。
若是直接使用root.stop(),就會出現以下的錯誤訊息:
1 | 1061: 呼叫可能未定義的方法 stop (透過靜態類型 flash.display:DisplayObject 的參考)。 |
解決方法有兩種:
一、使用MovieClip(parent)強制進行形態轉換
1 2 3 4 5 | btStop.addEventListener(MouseEvent.CLICK, btStopClickHandler); function btStopClickHandler(evt:MouseEvent):void { //控制上一階層影片片段停止 MovieClip(this.parent).stop(); } |
二、使用as運算子,使它被辨識為MovieClip物件
1 2 3 4 5 6 | btPlay.addEventListener(MouseEvent.CLICK, btPlayClickHandler); function btPlayClickHandler(evt:MouseEvent):void { //控制上一階層影片片段開始 var myParent:MovieClip = parent as MovieClip; myParent.play(); } |
所以透過上述兩種語法就可以控制不同上面階層的物件,是個需要注意的小細節。
相關文章:


謝謝你
不過我用第一個方法會出現
TypeError: Error #1034: 強制轉型失敗: 無法將 flash.display::Stage@965d1e9 轉換成 flash.display.MovieClip。at _fla::MainTimeline/sceneStopHandler()
第二個方法會出現
TypeError: Error #1009: 無法存取 Null 物件參考的屬性或方法。
at _fla::MainTimeline/scenePlayHandler()
但是用this.stop();就可以了
後來發現原來第一個方法的MovieClip(this.parent).stop();中的this換成影片片段的命名就可以了