使用物件

ActionScript 是一種物件導向的程式語言。物件導向程式設計只是一種程式設計的方式,並使用物件來組織程式中的程式碼。

以前「電腦程式」這個名詞是定義為電腦執行的一系列步驟或指示。就概念上來說,可以將電腦程式視為一長串指示的清單。不過,在物件導向程式設計中,程式指示分散到不同的物件。程式碼會組成不同的功能區塊,因此相關的功能類型或相關的資訊片段會群組在一個容器中。

Adobe Flash Professional

如果使用過 Flash Professional 的元件,您就已經使用過物件了。假設您定義一個矩形的影片片段元件,然後將其副本放在「舞台」上。這個影片片段元件等於 (基本上) 就是 ActionScript 中的物件,即 MovieClip 類別的實體。

您可以修改影片片段的多個特性。選取它之後,您可以在「屬性」檢測器中變更值,例如它的 x 座標或寬度。您也可以做各種顏色調整,例如變更它的 Alpha (透明度) 或者套用投影濾鏡。您還可以使用其它 Flash Professional 工具進行變更,例如使用「自由變形」工具旋轉矩形。您可以在 Flash Professional 修改影片片段元件的所有方法,ActionScript 也都可以使用。您只需變更組合在 MovieClip 物件中的所有資料,就可以在 ActionScript 修改電影片段 。

在 ActionScript 物件導向程式設計中,任何類別都可能具有三種特性:

  • 屬性

  • 方法

  • 事件

這些特性可用來管理程式所使用的資料,以及決定要執行的動作和及其順序。

屬性

屬性是物件中所合併多項資料的其中一項資料。範例歌曲物件可能具有名為 artisttitle 的屬性,而 MovieClip 類別則具有像是 rotationxwidthalpha 的屬性。屬性的使用方式與個別變數相同。事實上,您可以將屬性當做是物件所包含的「子」變數。

下面是 ActionScript 程式碼使用屬性的幾個範例。這一行程式碼會將名為 square 的 MovieClip 移至 x 座標 100 像素的位置:

square.x = 100;

此程式碼會使用 rotation 屬性來旋轉 square MovieClip,以便與 triangle MovieClip 的旋轉角度相符:

square.rotation = triangle.rotation;

此程式碼會變更 square MovieClip 的水平縮放,讓寬度成為原來的 1.5 倍:

square.scaleX = 1.5;

請注意這幾段程式碼的共通結構:首先會使用變數 (squaretriangle) 做為物件的名稱,後面接著一個英文句點 (.),然後再加上屬性的名稱 (xrotationscaleX)。這個英文句點稱為「點運算子」,用來表示存取物件的其中一個子元素。這整個結構 (「變數名稱-點-屬性名稱」) 可當做單一變數,代表電腦記憶體中單一值的名稱。

方法

「方法」是物件可以執行的動作。例如,假設您在 Flash Professional 建立影片片段元件,它的時間軸有數個關鍵影格和動畫。影片片段就可以播放、停止或指示將播放磁頭移至特定影格。

下面這行程式碼指示名為 shortFilm 的 MovieClip 開始播放:

shortFilm.play();

這行程式碼會指示名為 shortFilm 的 MovieClip 停止播放 (播放磁頭會立即停止,就像暫停視訊一樣):

shortFilm.stop();

這行程式碼會指示名為 shortFilm 的 MovieClip 將播放磁頭移至「影格 1」,然後停止播放 (就像倒帶一樣):

shortFilm.gotoAndStop(1);

方法與屬性的存取方式類似,一樣是先寫物件的名稱 (變數),後面接著一個英文句點,然後加上方法的名稱,後面接著括號。括號的作用是「呼叫」方法,也就是指示物件執行動作。有時候括號內會放入值 (或變數),這表示會一起傳遞執行動作所需的其它資訊。這些值稱為方法「參數」。例如,gotoAndStop() 方法就必須知道要移至哪一個影格,因此需要在括號內加上單一參數。其它像是 play()stop() 等方法的本身指示就很清楚,因此不需要額外的資訊。不過,這些方法後面還是要加上括號。

與屬性 (和變數) 不同的是,方法不能當做值預留位置。不過有些方法可以執行計算,然後傳回的結果可當做變數。例如,Number 類別的 toString() 方法會將數值轉換為文字表示:

var numericData:Number = 9; 
var textData:String = numericData.toString();

假設您要將 Number 變數的值顯示在螢幕上的文字欄位中,就必須使用 toString() 方法。TextField 類別的 text 屬性定義為 String,表示只能包含文字值。(text 屬性代表實際顯示在螢幕的文字內容)。這行程式碼會將變數 numericData 中的數值轉換為文字。然後顯示在螢幕上名為 calculatorDisplay 的 TextField 物件中:

calculatorDisplay.text = numericData.toString();

事件

電腦程式為電腦逐步執行的一系列指示。某些簡單的電腦程式確實如此,電腦只需執行幾個步驟就結束程式。但是,ActionScript 程式會持續執行,等待使用者輸入或其它動作。而「事件」就是決定電腦應執行哪些指示以及何時執行的機制。

基本上,「事件」是 ActionScript 知道而且可以回應的情況。很多事件是與使用者互動有關,例如使用者按一下某個按鈕或者按下鍵盤上的某個按鍵。事件還有其他類型。舉例來說,假設您使用 ActionScript 載入外部影像,就會有事件讓您知道影像何時載入完畢。當 ActionScript 程式執行時,就概念上,它只是在等候特定的事情發生而已。當事情發生後,就會執行您為這些事件指定的特定 ActionScript 程式碼。

基本事件處理

指定執行特定動作以回應特定事件的技巧稱為「事件處理」。當撰寫 ActionScript 程式碼來執行事件處理時,需要先找出三個重要元素:

  • 事件來源:事件會發生在哪一個物件?例如,按下哪一個按鈕,或者是由哪一個 Loader 物件載入影像?事件來源又稱為「事件目標」。因為電腦就是將這個物件當做是事件的目標 (也就是,事件實際發生的地方),因此這樣稱呼它。

  • 事件:會發生什麼情況,也就是要回應的情況為何?這是必須指出的特定項目,因為很多物件會觸發多個事件。

  • 回應:事件發生時,要執行的步驟?

當您撰寫 ActionScript 程式碼來處理事件時,便需要這三個元素。程式碼會遵循這個基本結構 (粗體字的元素是預留位置,您要視特定情況填寫):

function eventResponse(eventObject:EventType):void 
{ 
    // Actions performed in response to the event go here. 
} 
  
eventSource.addEventListener(EventType.EVENT_NAME, eventResponse);

此程式碼會執行兩個動作:首先會定義函數,以指定動作來回應事件。接下來,它會呼叫來源物件的 addEventListener() 方法。呼叫 addEventListener() 基本上會將這個函數「訂閱」給指定的事件使用。當事件發生後,就會執行函數的動作。下面將針對各個部分詳細說明。

「函數」是由多個動作所組成,用單一名稱來代表執行這些動作的捷徑名稱。函數與方法大致相同,但函數不一定要與特定類別相關聯。(實際上,您可將「方法」定義為與特定類別相關聯的函數。)當您建立函數來處理事件時,可以選擇函數的名稱 (在此例中,函數名稱為 eventResponse),您也指定一個參數 (在此例中,參數名稱為 eventObject)。指定函數參數就像宣告變數,因此您也必須指定參數的資料類型 (在此範例中,參數的資料類型為 EventType)。

您要偵聽的每種事件都有一個相關聯的 ActionScript 類別。您為函數參數所指定的資料類型也固定會是與要回應之特定事件相關的類別。例如,click 事件 (當使用者以滑鼠按一下某個項目時觸發) 與 MouseEvent 類別相關聯。若要針對 click 事件撰寫偵聽程式函數,您需要以資料類型為 MouseEvent 的參數定義偵聽程式函數。最後,請在左右大括號 ({ ... }) 之間,撰寫事件發生時,電腦要執行的指示。

撰寫事件處理函數。接下來就需要指示事件來源物件 (即發生事件的物件,例如按鈕),在事件發生時必須呼叫函數。呼叫該物件的 addEventListener() 方法 (具有事件的所有物件都會有 addEventListener() 方法),將您的函數註冊至事件來源物件。addEventListener() 方法使用兩個參數:

  • 第一個是要回應的特定事件名稱。每個事件都會與特定類別相關聯。每個事件類別會為它的每個事件定義特殊的值,就像是獨一無二的名稱。第一個參數會使用該值。

  • 第二個是事件回應函數的名稱。請注意,當函數當做參數傳遞時,其名稱在撰寫時是不加括號的。

事件處理程序

以下是您在建立事件偵聽程式時的逐步程序說明。這個範例是建立偵聽程式函數,當您按下 myButton 物件時,就會呼叫這個函數。

程式設計人員所撰寫的實際程式碼如下所示:

function eventResponse(event:MouseEvent):void 
{ 
    // Actions performed in response to the event go here. 
} 
 
myButton.addEventListener(MouseEvent.CLICK, eventResponse);

以下是此程式碼執行時的實際運作情形。

  1. SWF 檔載入時,電腦就會記下有個名叫 eventResponse() 函數的事實。

  2. 接著,電腦會執行程式碼 (明確地說,不屬於函數的程式碼)。在這裡只有一行程式碼,它會針對事件來源物件 (名為 myButton) 呼叫 addEventListener() 方法,並傳遞 eventResponse 函數當做參數。

    在內部,myButton 會記錄一份可以偵聽各個事件的函數清單。呼叫它的 addEventListener() 方法時,myButton 會將 eventResponse() 函數儲存至它的事件偵聽程式清單。

  3. 當使用者按下 myButton 物件時,就會觸發其 click 事件 (就是程式碼中的 MouseEvent.CLICK)。

    此時,會發生下列情況:

    1. 建立一個物件,也就是與上述事件相關聯的類別實體 (在這個範例中是指 MouseEvent)。對很多事件而言,這個物件是 Event 類別的實體。對滑鼠事件而言,它就是 MouseEvent 實體。對其它事件而言,則是與該事件相關的類別實體。建立的這個物件就是所謂的「事件物件」,會包含所發生事件的相關特定資訊:事件的類型、發生位置以及其它事件特有的資訊 (如果有的話)。

    2. 電腦接著會檢閱 myButton 儲存的事件偵聽程式清單。它會逐一檢視這些函數、呼叫每個函數,並將事件物件當做參數傳遞至函數。由於 eventResponse() 函數是 myButton 的偵聽程式之一,因此電腦在執行這個程序時,也會呼叫 eventResponse() 函數。

    3. 呼叫 eventResponse() 函數時,該函數的程式碼就會執行,進而執行您所指定的動作。

事件處理範例

以下是一些更具體的事件處理程式碼範例。這些範例可以協助您瞭解一些常見的事件元素,以及撰寫事件處理程式碼時可能的變化:

  • 按一下按鈕,讓目前的影片片段開始播放。在下列範例中,playButton 是按鈕的實體名稱,而 this 是代表「目前物件」的特殊名稱:

    this.stop(); 
     
    function playMovie(event:MouseEvent):void 
    { 
        this.play(); 
    } 
     
    playButton.addEventListener(MouseEvent.CLICK, playMovie);
  • 偵測文字欄位的輸入內容。在這個範例中,entryText 是輸入文字欄位,而 outputText 是動態文字欄位:

    function updateOutput(event:TextEvent):void 
    { 
        var pressedKey:String = event.text; 
        outputText.text = "You typed: " + pressedKey; 
    } 
     
    entryText.addEventListener(TextEvent.TEXT_INPUT, updateOutput);
  • 按一下按鈕以瀏覽至 URL。在此例中,linkButton 是按鈕的實體名稱:

    function gotoAdobeSite(event:MouseEvent):void 
    { 
        var adobeURL:URLRequest = new URLRequest("http://www.adobe.com/"); 
        navigateToURL(adobeURL); 
    } 
     
    linkButton.addEventListener(MouseEvent.CLICK, gotoAdobeSite);

建立物件實體

物件必須存在,才能在 ActionScript 中使用該物件。建立物件需要先宣告變數,但宣告變數只會在電腦記憶體中建立一個空位置。您必須將實際值指派給變數 (建立物件並將物件儲存在變數中),才能使用或操作變數。建立物件的程序稱為「實體化」物件。換言之,就是建立特定類別的實體。

若要建立物件實體,有一個簡單的方法完全不需要使用 ActionScript。在 Flash Professional 中,將影片片段元件、按鈕元件或文字欄位放在「舞台」上,然後指定其實體名稱。Flash Professional 就會自動宣告同名變數、建立物件實體,然後將該物件儲存在變數中。同樣地,在 Flex 中,當您編寫 MXML 標籤或將組件放在 Flash Builder 「設計」模式的編輯器時,會在 MXML 中建立組件。為該組件指定 ID,該 ID 就會成為內含該組件實體的 ActionScript 變數的名稱。

不過,您不一定都會建立視學上的物件,對於非視覺性的物件就不可能這麼做。您還可以使用其他方法,只需使用 ActionScript 便可以建立物件實體。

針對幾種 ActionScript 資料類型,您可以使用「常值運算式」(即直接寫入 ActionScript 程式碼的值) 建立實體。下面是一些範例:

  • 常值數值 (直接輸入數字):

    var someNumber:Number = 17.239; 
    var someNegativeInteger:int = -53; 
    var someUint:uint = 22;
  • 常值 String 值 (用雙引號括住文字):

    var firstName:String = "George"; 
    var soliloquy:String = "To be or not to be, that is the question...";
  • 常值 Boolean 值 (使用常值 truefalse):

    var niceWeather:Boolean = true; 
    var playingOutside:Boolean = false;
  • 常值 Array 值 (以方括號括住以逗號分隔的值清單):

    var seasons:Array = ["spring", "summer", "autumn", "winter"];
  • 常值 XML 值 (直接輸入 XML):

    var employee:XML = <employee> 
            <firstName>Harold</firstName> 
            <lastName>Webster</lastName> 
        </employee>;

ActionScript 也可針對 Array、RegExp、Object 和 Function 資料類型定義常值運算式。

為任何資料類型建立實體,最常用的方法就是使用 new 運算子加上類別名稱,如下所示:

var raceCar:MovieClip = new MovieClip(); 
var birthday:Date = new Date(2006, 7, 9);

使用 new 運算子建立物件通常描述為「呼叫類別的建構函式」。「建構函式」是特殊的方法,會在建立類別的實體時呼叫。請注意,當您使用這種方法建立實體的時候,要在類別名稱後面加上圓括弧。有時候您會在圓括弧中指定參數值。建立方法時,也會執行以下兩件事。

即使是使用常值運算式建立實體的資料類型,您也可以使用 new 運算子建立物件實體。例如,下面兩行程式碼的作用相同:

var someNumber:Number = 6.33; 
var someNumber:Number = new Number(6.33);

請務必熟悉使用 new ClassName() 來建立物件的方式。很多 ActionScript 資料類型不會有視覺呈現。因此,利用在 Flash Professional 「舞台」或 Flash Builder 的 MXML 編輯器「設計」模式中放上項目,並無法建立它們。您只能使用 new 運算子,在 ActionScript 建立這些資料類型的實體。

Adobe Flash Professional

在 Flash Professional 中,如果是在「元件庫」中定義但未放在「舞台」上的影片片段元件,也可以使用 new 運算子建立其實體。