2010-02-17 20 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