Программно перематываемый видеоклип удаляет градиентную маску (FlashCS4 / AS3) - PullRequest
1 голос
/ 17 февраля 2010

Я пытаюсь создать фильм с автоперемоткой с использованием маски градиента во Flash CS4 с использованием AS3. единственная проблема, с которой я сталкиваюсь, это когда фрагмент ролика достигает конца временной шкалы, maskingLayerMC теряет градиент. поэтому, пока фильм перематывается, слой маскировки не имеет градиента. он восстанавливает свой градиент, когда точка воспроизведения достигает первого кадра и снова начинает играть.

Я попытался добавить логические свойства .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 ]

1 голос
/ 18 февраля 2010

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

Это всего лишь предположение, так как я не вижу, как вы настроили свой 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 голосов
/ 18 февраля 2010

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

...