2010-02-17 2 views
1

Я пытаюсь создать фильм с автоматическим перемоткой с использованием маски градиента в Flash CS4 с использованием AS3. единственная проблема, с которой я сталкиваюсь, - это когда клип достигает конца временной линии, maskingLayerMC теряет свой градиент. поэтому, пока фильм перематывается, маскирующий слой не имеет градиента. он восстанавливает свой градиент, когда игровая точка достигает первого кадра и снова начинает играть.Программный перемотка видеоролика удаляет градиентную маску (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

Я попытался воссоздать вашу ошибку, но она отлично работает для меня. Я предполагаю, что это из-за использования ключевых кадров, ключевые кадры имеют неприятный побочный эффект повторного создания объектов на стадии te. Это верно только в том случае, если ключевые кадры размещены на том же уровне, что и ваш объект.

Это только предположение, хотя я не вижу, как вы настроили свой FLA.

Вот код, который работает для меня, с основным отличием в том, что я не использую фрейм-скрипты, а класс для объекта, который содержит анимацию 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; 
      } 

     } 
    } 
} 
+0

, похоже, не является проблемой ключевого кадра. чтобы проверить вашу теорию, я добавил функцию перемотки клипа до того, как он достигнет конца. маскирующий слой по-прежнему теряет эффект градиента. Кроме того, можно ли рассматривать смягчение в вашем программном решении? – TheDarkIn1978

+0

Извините, мой облегчающий вопрос был немым. пожалуйста, не обращайте внимания. – TheDarkIn1978

0

Вы пытались создать экземпляр maskingLayerMC в LAST-кадре? Я подозреваю, что, поскольку он создается в первом кадре, когда вы начинаете в конце, с точки зрения Flash, маски не существует. Поэтому он не получает экземпляр, пока он не перемотается обратно в первый кадр. Имеет ли это смысл?

+0

maskingLayerMC простирается до конца как движение движения. в то время как он перематывает маску, она все еще существует, просто она теряет эффект градиента. Я решил проблему, добавив логические свойства cacheAsBitmap в оператор if. в то время как это работает, я до сих пор не понимаю, почему он работает, и, возможно, это не лучшая вещь. Я отправил новый код. – TheDarkIn1978

Смежные вопросы