동영상 클립 재생 제어
Flash Player 9 이상, Adobe AIR 1.0 이상
Flash에서는 타임라인 메타포를 사용하여 애니메이션이나 상태 변경을 나타냅니다. 타임라인을 사용하는 시각적 요소는 MovieClip 객체이거나 MovieClip 클래스에서 확장해야 합니다. ActionScript 명령으로 무비 클립을 중지하거나 재생하거나 타임라인의 다른 지점으로 이동할 수는 있지만 ActionScript를 사용하여 동적으로 타임라인을 만들거나 특정 프레임에 내용을 추가할 수는 없습니다. 이러한 작업은 Flash 제작 도구에서만 가능합니다.
MovieClip을 재생하는 경우 SWF 파일의 프레임 속도에 의해 지정된 속도로 타임라인을 진행합니다. 또는 ActionScript에서 Stage.frameRate 속성을 설정하여 이 설정을 덮어쓸 수 있습니다.
무비 클립 재생 및 재생 중지
play() 및 stop() 메서드를 사용하면 타임라인 전체에서 무비 클립의 기본 컨트롤을 사용할 수 있습니다. 예를 들어, 자전거가 화면을 가로질러 움직이는 애니메이션이 포함된 무비 클립 심볼이 스테이지에 있고 이 클립의 인스턴스 이름이 bicycle로 지정되었다고 가정해 봅니다. 이 경우 기본 타임라인의 키프레임에 다음 코드가 첨부되면,
bicycle.stop();
자전거는 움직이지 않게 됩니다. 다시 말해 애니메이션이 재생되지 않습니다. 자전거의 움직임은 다른 사용자 조작을 통해서도 시작할 수 있습니다. 예를 들어, startButton이라는 버튼이 있는 경우, 기본 타임라인의 키프레임에 다음 코드를 적용하면 버튼을 클릭해야 애니메이션이 재생되도록 만듭니다.
// This function will be called when the button is clicked. It causes the
// bicycle animation to play.
function playAnimation(event:MouseEvent):void
{
bicycle.play();
}
// Register the function as a listener with the button.
startButton.addEventListener(MouseEvent.CLICK, playAnimation);
빨리 감기 및 되감기
play() 및 stop() 메서드를 사용하는 방법 외에도 무비 클립에서 재생을 제어하는 다른 방법이 있습니다. nextFrame() 및 prevFrame() 메서드를 사용하여 재생 헤드를 타임라인을 따라 수동으로 빨리 감거나 되감을 수도 있습니다. 이러한 메서드 중 하나를 호출하면 재생이 중지되고 재생 헤드가 앞으로 또는 뒤로 각각 이동합니다.
play() 메서드를 사용하는 것은 무비 클립 객체의 enterFrame 이벤트가 트리거될 때마다 nextFrame()을 호출하는 것과 비슷합니다. 이러한 맥락에서, 다음과 같이 enterFrame 이벤트에 대한 이벤트 리스너를 만들고 bicycle이 해당 리스너 함수 내의 이전 프레임으로 이동하도록 지시하는 방법으로 bicycle 무비 클립의 되감기를 실행할 수 있습니다.
// This function is called when the enterFrame event is triggered, meaning
// it's called once per frame.
function everyFrame(event:Event):void
{
if (bicycle.currentFrame == 1)
{
bicycle.gotoAndStop(bicycle.totalFrames);
}
else
{
bicycle.prevFrame();
}
}
bicycle.addEventListener(Event.ENTER_FRAME, everyFrame);
일반적으로 재생할 때 무비 클립에 둘 이상의 프레임이 있는 경우 이 무비 클립을 재생하면 무한정 반복됩니다. 즉, 마지막 프레임을 지나면 프레임 1로 돌아옵니다. prevFrame() 또는 nextFrame()을 사용하면 이러한 비헤이비어가 자동으로 발생하지 않습니다. 다시 말해서, 재생 헤드가 프레임 1에 있을 때 prevFrame()을 호출해도 재생 헤드가 마지막 프레임으로 이동하지 않습니다. 위 예제에서 if 조건은 재생 헤드가 첫 번째 프레임으로 되감기를 진행했는지 확인하고, 재생 헤드를 마지막 프레임 앞에 오도록 설정하여 되감기를 실행하는 무비 클립이 효과적으로 반복되도록 만듭니다.
다른 프레임으로 이동 및 프레임 레이블 사용
새 프레임에 무비 클립을 보내는 작업은 간단합니다. gotoAndPlay() 또는 gotoAndStop()을 호출하면 무비 클립이 매개 변수로 지정된 프레임 번호로 이동합니다. 또는 프레임 레이블 이름과 일치하는 문자열을 전달할 수 있습니다. 타임라인의 모든 프레임에 레이블을 지정할 수 있습니다. 그렇게 하려면 타임라인에서 프레임을 선택하고 속성 관리자의 [프레임 레이블] 필드에 이름을 입력합니다.
특히 복잡한 무비 클립을 만드는 경우에 번호 대신 프레임 레이블을 사용하는 것이 좋습니다. 애니메이션의 프레임, 레이어 및 트윈 개수가 많아지면 중요한 프레임에 대해 무비 클립 비헤이비어의 변화를 나타내는 설명(예: "off", "walking" 또는 "running")으로 레이블을 지정하는 것이 좋습니다. 레이블이 지정된 프레임으로 가는 ActionScript 호출은 특정 프레임 번호가 아닌 하나의 참조, 즉 레이블을 가리키므로 이렇게 하면 코드의 가독성도 향상되고 유연성도 증가합니다. 나중에 애니메이션의 특정 선분을 다른 프레임으로 이동할 경우 새 위치에서 해당 프레임의 레이블을 동일하게 유지하는 한 ActionScript 코드를 변경할 필요가 없습니다.
ActionScript 3.0은 프레임 레이블을 코드로 표시할 수 있도록 FrameLabel 클래스를 제공합니다. 이 클래스의 각 인스턴스는 단일 프레임 레이블을 나타내며, name 속성(속성 관리자에 지정된 프레임 레이블 이름을 나타냄) 및 frame 속성(레이블이 배치될 타임라인 프레임의 프레임 번호를 나타냄)을 가지고 있습니다.
무비 클립 인스턴스와 연관된 FrameLabel 인스턴스에 액세스할 수 있도록 MovieClip 클래스에는 FrameLabel 객체를 직접 반환하는 두 개의 속성이 포함되어 있습니다. currentLabels 속성은 무비 클립 전체 타임라인의 모든 FrameLabel 객체로 이루어진 배열을 반환합니다. currentLabel 속성은 최근에 타임라인에 나타난 FrameLabel 객체의 이름이 포함된 문자열을 반환합니다.
로봇이라는 무비 클립을 만들었으며 애니메이션의 여러 가지 상태에 레이블을 지정했다고 가정할 경우 다음 코드와 같이 로봇의 현재 상태에 액세스할 수 있는 currentLabel 속성을 확인하는 조건을 설정할 수 있습니다.
if (robot.currentLabel == "walking")
{
// do something
}
장면을 사용한 작업
Flash 제작 환경에서는 SWF 파일이 진행되는 타임라인을 연속으로 보여 주는 장면을 사용할 수 있습니다. gotoAndPlay() 또는 gotoAndStop() 메서드의 두 번째 매개 변수를 사용하면 재생 헤드를 보낼 수 있는 장면을 지정할 수 있습니다. 모든 FLA 파일은 첫 장면으로만 시작하지만 새 장면을 만들 수도 있습니다.
장면에는 단점이 많으므로 장면을 사용하는 것이 항상 최선은 아닙니다. 여러 장면이 포함된 Flash 문서는 유지 관리가 어려울 수 있습니다. 특히 제작자가 여러 명인 경우 더욱 그렇습니다. 제작 프로세스 동안 모든 장면을 하나의 타임라인에 병합하므로 장면이 여러 개인 경우 대역폭이 불충분할 수도 있습니다. 따라서 장면이 재생된 적이 없는 경우에도 모든 장면이 점진적으로 다운로드될 수 있습니다. 따라서 여러 타임라인을 기반으로 하는 장편 애니메이션을 구성하는 경우를 제외하고는 여러 장면을 사용하지 않는 것이 좋습니다.
MovieClip 클래스의 scenes 속성은 SWF 파일에 있는 모든 장면을 나타내는 Scene 객체의 배열을 반환합니다. currentScene 속성은 현재 재생 중인 장면을 나타내는 Scene 객체를 반환합니다.
Scene 클래스에는 장면 정보를 제공하는 여러 속성이 있습니다. labels 속성은 해당 장면 내의 프레임 레이블을 나타내는 FrameLabel 객체의 배열을 반환합니다. name 속성은 장면의 이름을 문자열로 반환합니다. numFrames 속성은 장면의 전체 프레임 수를 나타내는 int를 반환합니다.