【问题标题】:Programatically Rewinding Movie Clip Removes Gradient Mask (FlashCS4/AS3)以编程方式倒带影片剪辑移除渐变蒙版 (Flash CS4/AS3)
【发布时间】:2010-02-17 20:58:33
【问题描述】:

我正在尝试使用 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();}
    }

【问题讨论】:

    标签: flash actionscript-3 gradient mask


    【解决方案1】:

    我尝试重新创建您的错误,但对我来说效果很好。我的猜测是因为使用了关键帧,关键帧具有在舞台上重新实例化对象的讨厌的副作用。 仅当关键帧与您的对象放置在同一层时才适用。

    这只是一个猜测,因为我看不出您是如何设置 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;
                }
    
            }
        }
    }
    

    【讨论】:

    • 似乎不是关键帧问题。为了测试你的理论,我添加了一个在剪辑结束之前倒带的功能。遮罩层仍然失去它的渐变效果。另外,是否可以考虑在您的代码解决方案中使用 easing?
    • 抱歉,我的宽松问题很愚蠢。请无视。
    【解决方案2】:

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

    【讨论】:

    • maskingLayerMC 作为补间动画一直延伸到最后。虽然它正在倒带面具仍然存在,只是它失去了它的渐变效果。我通过在 if 语句中添加 cacheAsBitmap 布尔属性解决了这个问题。虽然这有效,但我仍然不明白它为什么有效,也许这不是最好的事情。我已经发布了新代码。
    猜你喜欢
    • 1970-01-01
    • 2014-09-25
    • 2013-09-29
    • 2018-03-29
    • 2011-07-19
    • 2010-11-05
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多