デフォルトでは、Flash ドキュメントのライブラリのムービークリップシンボルのインスタンスは、動的に作成することはできません。つまり、ActionScript を使用してのみ作成可能です。これは、ActionScript で使用する目的で書き出されるシンボルはすべて SWF ファイルに追加されますが、シンボルの中にはステージで使用されないものもあるからです。このような理由から、ActionScript でシンボルを使用可能にするには、シンボルを ActionScript に書き出すよう指定する必要があります。
ActionScript 用にシンボルを書き出すには :
-
ライブラリパネルでシンボルを選択し、シンボルプロパティダイアログボックスを開きます。
-
必要であれば、詳細設定を開きます。
-
「リンケージ」セクションで、「AcrionScript に書き出し」チェックボックスを選択します。
この操作を行うと「クラス」フィールドと「基本クラス」フィールドがアクティブ化されます。
デフォルトでは、「クラス」フィールドにはスペースを消去したシンボル名が表示されます。例えば、「Tree House」というシンボル名は、「TreeHouse」となります。シンボルの動作でカスタムクラスを使用するよう指定するには、パッケージも含むクラスのフルネームをこのフィールドに入力します。 ActionScript にシンボルのインスタンスを作成できるようにしたいが、動作を追加する必要がない場合は、クラス名をそのまま残しておくことができます。
「基本クラス」フィールドのデフォルト値は
flash.display.MovieClip
です。シンボルによって他のカスタムクラスの機能を拡張する場合、そのクラスが Sprite または MovieClip クラスを拡張できれば、代わりにそのクラスの名前を指定することができます。
-
「OK」ボタンをクリックして変更内容を保存します。
この段階で、シンボルに対して動作を追加する必要がなかった場合など、リンクされた SWC ファイルまたは指定クラスの定義を含んでいる外部 ActionScript ファイルが見つからなかった場合は、次の警告が表示されます。
クラスパスにこのクラスの定義が見つからなかったため、書き出す際に SWF ファイル内にクラスを自動生成します。
ライブラリシンボルで MovieClip クラスの機能以外の独自の機能が必要ない場合は、この警告を無視できます。
シンボルに対してクラスを提供しなければ、Flash はシンボルに対し、次のようなクラスを作成します。
package
{
import flash.display.MovieClip;
public class ExampleMovieClip extends MovieClip
{
public function ExampleMovieClip()
{
}
}
}
シンボルに対して ActionScript 機能を追加する場合は、この構造に適切なプロパティとメソッドを追加します。例えば、幅 50 ピクセル、高さ 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 ドキュメントの最初のフレームのキーフレームに配置される次のコードにより、シンボルのインスタンスが作成され、それが画面に表示されます。
var c:Circle = new Circle();
addChild(c);
trace(c.width);
trace(c.height);
trace(c.getArea());
trace(c.getCircumference());
次のコードでは、個々のアセットをステージ上にドラッグする代わりに、ActionScript ベースのインスタンス化を行っています。 作成される円には、ムービークリップのすべてのプロパティと Circle クラスに定義した独自のメソッドが含まれます。 これは非常に基本的な例です。ライブラリシンボルは、クラス内でプロパティとメソッドをいくつでも指定できます。
手作業で用意するのが困難な大量のインスタンスを動的に作成できるため、ActionScript ベースのインスタンス化は非常に有効です。 また、作成時に各インスタンスのプロパティをカスタマイズできるので、柔軟性にも優れています。ループを使用して複数の Circle インスタンスを動的に作成すると、これらの利点を理解できます。 Circle シンボルとクラスは Flash ドキュメントのライブラリであらかじめ記述されているので、次のコードを最初のフレームのキーフレーム上に配置します。
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
プロパティを設定することにより、ランダムなカラーが各インスタンスに付けられます。このプロパティは、MovieClip クラスを拡張することによって Circle が継承します。