我正在尝试使用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();}
}
答案 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的角度来看,掩码不存在。因此,在重新回退到第一帧之前,它不会被实例化。这有意义吗?