2010-02-17 21 views
1

我想創建一個自動回捲電影在Flash CS4中使用漸變蒙版使用AS3。我遇到的唯一問題是當影片剪輯到達時間線結束時,maskingLayerMC失去它的漸變效果。所以在電影倒帶時,maskingLayer沒有漸變。當播放頭到達第一幀並再次開始播放時,它恢復爲漸變。編程式倒帶影片剪輯刪除漸變蒙版(FlashCS4/AS3)

我已經嘗試在最後一幀添加.cacheAsBitmap布爾屬性,但它沒有任何效果,maskingLayerMC仍然失去它的漸變。

--- FIRST FRAME --- 

//Gradient Masking 
maskedLayerMC.mask = maskingLayerMC; 
maskingLayerMC.cacheAsBitmap = true; 
maskedLayerMC.cacheAsBitmap = true; 

//Automatically Rewind Movie Clip 
var playBackwards:Boolean = false; 

addEventListener(Event.ENTER_FRAME, playDirection); 
function playDirection (e:Event):void 
    { 
    if (playBackwards == true) 
     {prevFrame();} 
     else 
     {play();} 
    } 

--- LAST FRAME--- 

//Change Boolean Variable To Rewind Movie Clip (Place In Last Frame) 
stop(); 
playBackwards = true; 

[更新工作代碼]

雖然我不知道爲什麼這個工作,或者如果它是最好的解決方案。

--- FIRST FRAME --- 
//Automatically Rewind Movie Clip With Gradient Masking 
maskedLayerMC.mask = maskingLayerMC; 
var playBackwards:Boolean = false; 

addEventListener(Event.ENTER_FRAME, playDirection); 
function playDirection(e:Event):void 
    { 
    if (playBackwards == true) 
     { 
     prevFrame(); 
     maskingLayerMC.cacheAsBitmap = true; 
     maskedLayerMC.cacheAsBitmap = true; 
     } 
     else 
     { 
     play(); 
     maskingLayerMC.cacheAsBitmap = true; 
     maskedLayerMC.cacheAsBitmap = true; 
     } 
    } 

--- LAST FRAME--- 
//Change Boolean Variable To Rewind Movie Clip (Place In Last Frame) 
stop(); 
playBackwards = true; 

看來,問題出在prevFrame()函數,因爲簡單的playDirection函數內部一次添加的屬性是不夠的。所以下面的代碼令人沮喪地不起作用。

addEventListener(Event.ENTER_FRAME, playDirection); 
function playDirection(e:Event):void 
    { 
    maskingLayerMC.cacheAsBitmap = true; 
    maskedLayerMC.cacheAsBitmap = true; 

    if (playBackwards == true) 
     {prevFrame();} 
     else 
     {play();} 
    } 

回答

1

我試着重新創建你的bug,但它對我來說工作正常。我的猜測是因爲使用了關鍵幀,關鍵幀具有重新實例化舞臺上的對象的令人討厭的副作用。 只有當關鍵幀與對象位於同一圖層時,這纔是真實的。

這只是一個猜測,因爲我看不到你是如何設置你的FLA。

這裏是適用於我的代碼,主要區別在於我不使用框架腳本,而是使用包含動畫動畫片段和屏蔽動畫片段的對象的類。

package { 

    import flash.display.MovieClip; 
    import flash.events.Event; 

    public class Test extends MovieClip { 

     public var ani:MovieClip; 
     public var mcMask:MovieClip; 
     public var dir:int = 1; 

     public function Test() { 
      ani.cacheAsBitmap = true; 
      mcMask.cacheAsBitmap = true; 
      ani.mask = mcMask; 
      addEventListener(Event.ENTER_FRAME, animate); 
     } 

     private function animate(e:Event) { 
      ani.gotoAndStop(ani.currentFrame + dir); 

      //change direction when the end or beginning is reached 
      if(ani.currentFrame == ani.totalFrames || ani.currentFrame == 1) { 
       dir *= -1; 
      } 

     } 
    } 
} 
+0

似乎不是關鍵幀問題。爲了測試你的理論,我添加了一個函數在剪輯到達結尾之前倒回。掩蔽層仍然失去了漸變效果。 此外,是否可以考慮在您的代碼解決方案中進行緩解? – TheDarkIn1978 2010-02-17 23:01:32

+0

對不起,我的寬鬆問題是愚蠢的。請忽略。 – TheDarkIn1978 2010-02-17 23:24:54

0

您是否嘗試過在最後一幀創建maskingLayerMC實例?我懷疑這是因爲它是在第一幀中創建的,當你從最後開始時,從Flash的角度來看,這個蒙版並不存在。因此它不會實例化,直到它回退到第一幀。那有意義嗎?

+0

maskingLayerMC作爲補間動畫一直延伸到最後。而倒帶的面具依然存在,只是它失去了漸變效果。我已經通過在if語句中添加cacheAsBitmap布爾屬性來解決問題。雖然這有效,但我仍然不明白它爲什麼有效,也許這不是最好的做法。我已經發布了新的代碼。 – TheDarkIn1978 2010-02-17 22:18:02