依據預設,在 Flash 文件之元件庫中的影片片段元件實體無法以動態方式建立 (亦即,僅能使用 ActionScript 來建立)。這是因為要匯出在 ActionScript 中使用的每一個元件都會增加 SWF 檔的大小,而且已知有些元件可能不會用於舞台上。因此,為了讓某個元件可在 ActionScript 中使用,您必須指定應該將該元件匯出給 ActionScript 使用。
匯出元件給 ActionScript 使用:
-
在「元件庫」面板中選取元件,然後開啟其「元件屬性」對話方塊。
-
若有需要,請啟動「進階」設定。
-
在「連結」區段中,啟動「匯出給 ActionScript 使用」核取方塊。
這麼做將會啟動「類別」和「基底類別」欄位。
根據預設,會將移除空格的元件名稱填入「類別」欄位 (例如,名稱為「Tree House」的元件會變成「TreeHouse」)。若要指定元件應該為其行為使用自訂類別,請輸入類別的完整名稱,包括它在這個欄位中的套件。如果您想要在 ActionScript 中能夠建立元件的實體,但是不需要加入任何其它行為,則可以保留原來的類別名稱。
「基底類別」欄位的值預設為
flash.display.MovieClip
。如果您希望元件能擴充另一個客戶類別的功能,只要該類別會擴充 Sprite (或 MovieClip) 類別,您就可以改指定該類別的名稱。
-
按「確定」按鈕儲存變更。
此時,如果 Flash 找不到連結的 SWC 檔案或具有指定類別之定義的外部 ActionScript 檔案 (例如,如果您不需要為元件加入其他行為),就會顯示警告:
「類別路徑中找不到這個類別的定義,將在匯出時自動產生至 SWF 檔」。
如果您的元件庫元件需要的功能不會超出 MovieClip 類別提供的範圍,就可以忽略這個警告。
如果您沒有為元件提供類別,Flash 將會為元件建立一個與此類別相等的類別:
package
{
import flash.display.MovieClip;
public class ExampleMovieClip extends MovieClip
{
public function ExampleMovieClip()
{
}
}
}
如果您希望在元件中加入額外的 ActionScript 功能,請在以下的程式碼結構內加入適當的屬性和方法。例如,假設您的影片片段元件包含寬度及高度都為 50 個像素的圓形,並且將元件指定為匯出給 ActionScript 並搭配名稱為 Circle 的類別使用。置入 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 類別的方式來繼承) 以賦予每一個實體一種隨機顏色。