2010-02-17 5 views
1

AS3을 사용하는 Flash CS4의 그래디언트 마스크를 사용하여 자동 되감기 동영상을 만들려고합니다. 내가 가지고있는 유일한 문제는 무비 클립이 타임 라인의 끝에 도달하면 maskingLayerMC가 그라디언트를 잃는 것입니다. 따라서 영화가 되감기를하는 동안 maskingLayer에는 그래디언트가 없습니다. 재생 헤드가 첫 번째 프레임에 도달하고 다시 한 번 재생되기 시작하면 그라디언트가 다시 나타납니다.프로그래밍 방식으로 무비 클립 되감기로 그래디언트 마스크 제거 (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; 

문제가 단순히 playDirection의 함수 내에서 한 번에 속성을 추가 이후 prevFrame() 함수입니다 충분하지 않은 것 같다. 그래서 다음 코드는 좌절하게 작동하지 않습니다.

addEventListener(Event.ENTER_FRAME, playDirection); 
function playDirection(e:Event):void 
    { 
    maskingLayerMC.cacheAsBitmap = true; 
    maskedLayerMC.cacheAsBitmap = true; 

    if (playBackwards == true) 
     {prevFrame();} 
     else 
     {play();} 
    } 

답변

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

     } 
    } 
} 
+0

은 키 프레임 문제가 아닙니다. 당신의 이론을 테스트하기 위해 클립이 끝나기 전에 클립을 되감기하는 함수를 추가했습니다. 마스킹 층은 그래디언트 효과를 잃어 버립니다. 또한 코드 솔루션에서 여유를 고려할 수 있습니까? – TheDarkIn1978

+0

죄송합니다. 여유로운 질문은 벙어리였습니다. 무시하십시오. – TheDarkIn1978

0

마지막 프레임에 maskingLayerMC 인스턴스를 만들려고 했습니까? 나는 그것이 첫 번째 프레임에서 생성되고 있기 때문에 플래시의 관점에서 보면 마스크가 존재하지 않는다고 생각할 것이다. 따라서 첫 번째 프레임으로 되감기까지 인스턴스화되지 않습니다. 말이 돼?

+0

maskingLayerMC는 모션 트윈으로 끝까지 확장됩니다. 마스크가 되감기는하지만 여전히 존재합니다. 단지 그라디언트 효과가 느껴지기도합니다. if 문 안에 cacheAsBitmap 부울 속성을 추가하여 문제를 해결했습니다. 그것이 효과가있는 동안, 나는 아직도 그것이 작동하는 이유를 이해하지 못할 수도 있고, 아마도 그것이 최선의 일이 아니라는 것을 이해할 수 있습니다. 새 코드를 게시했습니다. – TheDarkIn1978

관련 문제