以编程方式重新剪辑影片剪辑删除渐变蒙版(Flash CS4 / AS3)

时间:2010-02-17 20:58:34

标签: flash actionscript-3 gradient mask

我正在尝试使用AS3在Flash CS4中使用渐变蒙版创建自动倒带影片。我唯一的问题是当影片剪辑到达时间线的末尾时,maskingLayerMC会失去它的渐变。所以当电影回归时,maskingLayer没有渐变。当播放头到达第一帧并再次开始播放时,它会重新获得渐变效果。

我已经尝试在最后一帧上添加.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();}
    }

2 个答案:

答案 0 :(得分:1)

我尝试重新创建你的bug,但它对我来说很好。我的猜测是因为使用了关键帧,关键帧具有在te阶段重新实例化对象的令人讨厌的副作用。 仅当关键帧与对象放在同一层中时才会出现这种情况。

这只是猜测,因为我无法看到你如何设置你的FLA。

这是适用于我的代码,主要区别在于我不使用框架脚本,而是包含动画movieclip和masking movieclip的对象的类。

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;
            }

        }
    }
}

答案 1 :(得分:0)

您是否尝试在最后一帧中创建maskingLayerMC实例?我怀疑它是因为它是在第一帧中创建的,当你从最后开始时,从Flash的角度来看,掩码不存在。因此,在重新回退到第一帧之前,它不会被实例化。这有意义吗?