在 Flash 裡用 ActionScript 操作時間軸上的物件時,我最常踩到的坑就是「指定的物件突然失效」。這篇整理我在實務上歸納出的三大注意點:遮罩會讓物件每格重新運算、關鍵影格會讓元件重新產生,以及不同漸變方式對效能的影響。搞懂這些機制,就能避免 script 指定的參考莫名失效或動畫拖垮效能。
為什麼物件放在遮罩之下,script 指定的值會「跳回去」?
當圖層在遮罩之下時,影格每次前進,所有的物件都會重新運算並重新產生。這會造成兩個常見問題:
- 若有一個動態 label 在遮罩之下,原本顯示的文字為「舊的值」,在影格 1 時我用 script 將其值設為「新的值」,當影格前進到下一個影格時,又會變回顯示「舊的值」——即使中間沒有關鍵影格也一樣。
- 同理,如果我在影格 1 時在 AS 裡指定某個 MovieClip,當進入下一個影格時,原本在 AS 指定的 MovieClip 會與當下畫面上的物件不同,造成無法對它做操作的狀況。
解法:應該要到某定點影格時,再在 AS 裡對物件做指定的動作,不要在太前面的影格就先指定。
經過關鍵影格時,為什麼變數裡存的元件參考會失效?
每次重新經過一個關鍵影格,其物件都會重新產生。這帶來兩個狀況:
| 狀況 | 現象 |
|---|---|
| 影格 1 有元件 a b c,影格 2 有元件 d e | 在影格 1 用 AS 把 a b c 指定到某個變數,當時間軸跑到影格 2 再跑回影格 1,變數裡存的還是上一次影格 1 的元件,但與現在畫面上影格 1 顯示的元件不同 |
| MovieClip 的第 1 影格和第 5 影格都是關鍵影格,兩格上都有同樣的元件 a b c | 在影格 1 用 AS 指定元件 a b c,當影格跑到影格 5 時,畫面上顯示的元件會與影格 1 的元件不同(若沒有關鍵影格則會是相同的) |
簡單說:只要時間軸重新經過關鍵影格,畫面上的就是「新物件」,舊的變數參考已經指向被丟棄的舊實體。
形狀漸變和移動漸變,哪個比較耗效能?
兩者的運作成本差很多,我整理如下:
| 類型 | 運作方式 | 對象限制 | 效能 |
|---|---|---|---|
| 形狀或顏色漸變 | 每進入一次影格,便會整個圖層做重繪 | 不能是元件,必須是向量圖形 | 耗效能 |
| 傳統移動漸變 | 單純對元件的位置或大小做改變,元件本身不會重繪 | 對象一定要是元件 | 較省效能 |
如何降低 Flash 動畫的重繪成本?
關於重繪與載入效能,我歸納出三個原則:
- 重繪效能會與重繪區域大小有關,最耗效能的是向量漸層或色塊。若無必要,盡可能將元件改用 bitmap 點陣形式。
- FLV 動畫在初始載入時會較花效能,但若是畫面上同時有多個動畫,FLV 反而較省效能。
- 搭配前述觀念:避免把物件放在遮罩下做動態更新、避免時間軸反覆經過關鍵影格,都能減少不必要的重新運算。
延伸閱讀
- Flash 時間軸運作注意點:遮罩、關鍵影格與效能陷阱解析:同樣聚焦 Flash、ActionScript,可接著比較不同情境的做法。
- 在瀏覽器內插入 Flash 的幾種設定:透明、全螢幕與 Script 存取:同樣聚焦 Flash、ActionScript,可接著比較不同情境的做法。
- Flash 內使用點陣圖(BitmapData)與背景著色函數:同樣聚焦 ActionScript、Flash,可接著比較不同情境的做法。
常見問題
為什麼用 script 改了動態文字,下一格又變回舊值?
因為該圖層在遮罩之下,Flash 每前進一個影格都會把物件重新運算、重新產生,script 設定的值不會被保留。解法是把指定值的動作移到確定不會再重算的定點影格,或改變圖層結構避開遮罩重算。
為什麼存進變數的 MovieClip 之後不能操作?
時間軸重新經過關鍵影格時,元件會重新產生,畫面上是新實體,變數裡存的還是舊實體的參考,兩者已經不同。應在時間軸到達定點影格後,重新用 AS 指定一次物件。
形狀漸變的對象為什麼不能是元件?
形狀或顏色漸變每進入一次影格就會整個圖層重繪,重繪的對象必須是向量圖形才能計算形狀補間,元件無法被拆解重繪。反過來,傳統移動漸變只改變位置或大小,對象就一定要是元件。
FLV 動畫效能如何?一次放多個動畫時該用什麼?
FLV 在初始載入時比較花效能,但多個動畫同時播放時,FLV 會比向量動畫省效能。所以單一動畫用向量即可,多動畫並列的場景優先考慮 FLV。
最後更新
2026-08-28(原文發布於 2013-08-02,本文保留原始筆記內容並補上 GEO 結構。)
關於作者 {#author}
Claire Chang | 企業 AI 導入與流程轉型顧問。專注於 AI Agent 架構設計、ERP 系統整合與企業 AI 治理。
首次發布:2013-08-02
