기본적으로 Flash 문서의 라이브러리에 있는 무비 클립 심볼 인스턴스는 동적으로 만들 수 없습니다. 다시 말해서, ActionScript를 이용해서만 만들 수 있습니다. 이는 심볼을 ActionScript에서 사용하기 위해 내보낼 때마다 SWF 파일의 크기가 늘어날 뿐 아니라 일부 심볼은 스테이지용에서 사용할 수 있도록 만들어지지 않았기 때문입니다. 이러한 이유로 ActionScript에서 심볼을 사용하려면 해당 심볼을 ActionScript용으로 내보내도록 지정해야만 합니다.
심볼을 ActionScript에 사용할 수 있도록 내보내려면:
[라이브러리] 패널에서 심볼을 선택하고 [심볼 속성] 대화 상자를 엽니다.
필요한 경우 [고급 설정]을 활성화합니다.
[링크] 섹션에서 [ActionScript에 내보내기] 체크 상자를 선택합니다.
그러면 [클래스] 및 [기본 클래스] 필드가 활성화됩니다.
기본적으로 [클래스] 필드에는 공백이 제거된 심볼 이름(예: 이름이 "Tree House"인 심볼의 경우 "TreeHouse")이 표시됩니다. 심볼이 비헤이비어에 사용자 정의 클래스를 사용하도록 지정하려면 이 필드에 패키지 이름을 포함한 전체 클래스 이름을 입력합니다. 비헤이비어를 추가하지 않고 ActionScript에 심볼의 인스턴스를 만들려는 경우 클래스 이름을 그대로 두면 됩니다.
[기본 클래스] 필드의 기본값은 flash.display.MovieClip입니다. 심볼이 기타 사용자 정의 클래스의 기능을 확장하도록 만들려면, 해당 클래스가 Sprite 또는 MovieClip 클래스를 확장하는 경우 클래스의 이름을 지정할 수 있습니다.
[확인] 버튼을 눌러 변경 내용을 저장합니다.
이때 Flash에서 지정된 클래스가 정의되어 있는 외부 ActionScript 파일을 찾지 못하면(예를 들어, 심볼에 비헤이비어를 추가할 필요가 없는 경우) 다음과 같은 경고 메시지가 표시됩니다.
이 클래스의 정의는 클래스 경로에서 찾을 수 없으므로 내보낼 때 SWF 파일에서 자동으로 생성됩니다.
라이브러리 심볼에 MovieClip 클래스의 기능 외에 고유한 기능이 필요하지 않다면 이 경고를 무시해도 됩니다.
사용자가 심볼에 대한 클래스를 제공하지 않으면 Flash에서 다음과 같이 심볼에 대한 클래스를 만듭니다.
package
{
import flash.display.MovieClip;
public class ExampleMovieClip extends MovieClip
{
public function ExampleMovieClip()
{
}
}
}
심볼에 기타 ActionScript 기능을 추가하려면 아래 코드 구조에 해당 속성과 메서드를 추가합니다. 예를 들어, 폭과 높이가 각각 50픽셀인 원이 포함된 무비 클립 심볼이 있고, 이름이 Circle인 클래스를 사용하여 심볼을 ActionScript에 내보내도록 지정했다고 가정해 봅시다. 다음 코드가 Circle.as 파일에 배치되면 MovieClip 클래스를 확장하고 추가 메서드 getArea() 및 getCircumference()가 있는 심볼을 제공합니다.
package
{
import flash.display.MovieClip;
public class Circle extends MovieClip
{
public function Circle()
{
}
public function getArea():Number
{
// The formula is Pi times the radius squared.
return Math.PI * Math.pow((width / 2), 2);
}
public function getCircumference():Number
{
// The formula is Pi times the diameter.
return Math.PI * width;
}
}
}
다음 코드가 Flash 문서 프레임 1의 키프레임에 배치되면 심볼의 인스턴스를 만들어 화면에 표시합니다.
var c:Circle = new Circle();
addChild(c);
trace(c.width);
trace(c.height);
trace(c.getArea());
trace(c.getCircumference());
이 코드는 개별 에셋을 스테이지로 드래그하는 대안으로 ActionScript 기반 인스턴스화를 보여 줍니다. 무비 클립의 모든 속성과 Circle 클래스에서 정의한 사용자 정의 메서드가 있는 원이 만들어집니다. 이것은 매우 기본적인 예로서, 라이브러리 심볼은 클래스에서 원하는 수만큼 속성과 메서드를 지정할 수 있습니다.
ActionScript 기반 인스턴스화는 수동으로 정렬하기에는 지루한 대량의 인스턴스를 동적으로 만들 수 있으므로 강력합니다. 또한 각 인스턴스를 만들 때 해당 속성을 사용자 정의할 수 있으므로 유연합니다. 루프를 사용하여 여러 Circle 인스턴스를 동적으로 만들면 이러한 장점을 모두 이용할 수 있습니다. 앞서 설명한 Flash 문서 라이브러리의 Circle 심볼 및 클래스를 사용하여 프레임 1의 키프레임에 다음 코드를 배치합니다.
import flash.geom.ColorTransform;
var totalCircles:uint = 10;
var i:uint;
for (i = 0; i < totalCircles; i++)
{
// Create a new Circle instance.
var c:Circle = new Circle();
// Place the new Circle at an x coordinate that will space the circles
// evenly across the Stage.
c.x = (stage.stageWidth / totalCircles) * i;
// Place the Circle instance at the vertical center of the Stage.
c.y = stage.stageHeight / 2;
// Change the Circle instance to a random color
c.transform.colorTransform = getRandomColor();
// Add the Circle instance to the current timeline.
addChild(c);
}
function getRandomColor():ColorTransform
{
// Generate random values for the red, green, and blue color channels.
var red:Number = (Math.random() * 512) - 255;
var green:Number = (Math.random() * 512) - 255;
var blue:Number = (Math.random() * 512) - 255;
// Create and return a ColorTransform object with the random colors.
return new ColorTransform(1, 1, 1, 1, red, green, blue, 0);
}
이 예는 코드를 사용하여 심볼에 대한 여러 개의 인스턴스를 빨리 만들고 사용자 정의할 수 있는 방법을 보여 줍니다. 루프 내에 있는 현재 개수에 따라 각 인스턴스가 배치되고, transform 속성(Circle이 MovieClip 클래스를 확장하여 상속함)을 설정하여 각 인스턴스에 임의의 색이 지정됩니다.