跳轉到內容

ActionScript 2.0 簡介/屬性和方法

來自華夏公益教科書
ActionScript 2.0 簡介
函式 屬性和方法 控制語句


關鍵概念


  • 屬性和方法
  • 全域性函式和變數
  • 主時間軸作為 MovieClip
  • 點訪問
  • thisthis._parent
  • with
  • 使用 [] 訪問屬性
  • 基本 MovieClip 方法和屬性
  • 使用建構函式進行初始化
  • 物件字面量
  • nullundefined

屬性和方法是構成類的兩個組成部分。屬性 是屬於特定類的變數。方法 是屬於特定類的函式。本章將介紹這對重要的組合。

什麼是頂層函式和全域性變數?

[編輯 | 編輯原始碼]

ActionScript 提供了大量內建函式。其中一些函式是內建類的(如 MovieClip 和 Math)方法。本章以及本書的第二部分將討論這些函式。其他內建函式不屬於內建類。它們可以在您需要的時候、您檔案中的任何位置使用。我們心愛的 trace() 就是其中之一。這些函式被稱為頂層函式全域性函式

全域性變數是在任何地方都可以訪問和更改的變數。_quality 變數就是一個很好的例子:它會影響整個 SWF 的質量。它們由 Flash 提供。[1]

重大新聞!

[編輯 | 編輯原始碼]

我們在此打斷本章,為您帶來重大新聞!

既然您已經看到了本章,是時候告訴您這個訊息了:主時間軸(您一直都在工作的時間軸)是一個 MovieClip 例項。

這意味著什麼?

請記住,所有物件都有屬性和方法。因此,主時間軸有各種內建屬性和方法需要我們學習。我們將在本章學習其中的一些,並將剩餘的部分留到下一部分。

還需要記住的是,您拖放到舞臺上的任何內容以及您在主時間軸上宣告的任何變數都是主時間軸的屬性。之所以可以向例項新增新屬性,是因為 MovieClip 是一個動態類。我們將在第三部分討論動態類。

如何訪問另一個物件的屬性?

[編輯 | 編輯原始碼]

訪問另一個物件屬性最常見的方法如下

objectName.propertyName

請注意,為了使此方法有效,我們必須確保 propertytName 是我們正在處理的物件的屬性。

讓我們嘗試一下。開啟 Flash。在庫中建立一個新的 MovieClip。在其中繪製一個蘋果,然後將其拖放到舞臺上的任何位置。將其例項名稱設定為 'apple'。[2] 現在再次點選蘋果。在第一幀上,輸入 var juiciness:Number = 5。(請記住:您在時間軸上宣告的所有變數都是該 MovieClip 的屬性。)輸入以下程式碼

程式碼 結果
trace(apple.juiciness);

5

在此程式碼中,我們使用點運算子跟蹤了蘋果的 juiciness 屬性。

什麼是 this_parent

[編輯 | 編輯原始碼]

this 用於指定當前位置。例如,如果您在主時間軸上,則 this.crunchiness 將返回主時間軸的 crunchiness 屬性。讓我們再次使用 this 嘗試一下我們的蘋果示例。

程式碼 結果
trace(this.apple.juiciness);

5

這與之前相同,只是它明確指出 apple 是當前物件(主時間軸)的屬性。如您所見,this 並不總是必要的。

必須使用 this 的一種情況是引數和時間軸變數具有相同的名稱。在這種情況下,必須在時間軸變數之前放置 this,以便計算機知道您不是在談論區域性變數。以下是一個示例

程式碼 結果
var someString:String = "random text";
function stringTogether(someString:String):String{
     return (someString + " " + this.someString);
}
trace(stringTogether("even randomer text"));

even randomer text random text

在此示例中,return (someString + " " + this.someString); 將區域性變數 someString、一個空格字元以及時間軸變數 someString 連線在一起。

到目前為止,我們只從主時間軸引用了蘋果。是否可以從蘋果中引用主時間軸?答案是:可以,這涉及到 _parent

開啟包含蘋果的 Flash 檔案,然後輸入以下程式碼

程式碼 結果

在主時間軸的第一幀中

var crunchiness:Number = 7;

在蘋果符號的第一幀中:

trace(this._parent.crunchiness);

7

在此示例中,蘋果包含在主時間軸中,因此主時間軸是蘋果的“父級”。現在假設您在蘋果中放了一條蟲子,並希望從蟲子中引用主時間軸。沒問題:您可以根據需要新增任意數量的 _parent

程式碼 結果

在主時間軸的第一幀中

var crunchiness:Number = 7;

在蟲子符號的第一幀中:

trace(this._parent._parent.crunchiness);

7

蟲子的父級是蘋果,蘋果的父級是主時間軸。就像魔法一樣有效!

with 是怎麼回事?

[編輯 | 編輯原始碼]

現在假設這條蟲子要踏上旅程,以降低主時間軸的脆度和甜度以及蘋果的汁液度。我們可以這樣做

程式碼 結果

在主時間軸的第一幀中

var crunchiness:Number = 7;
var sweetness:Number = 4;

在蘋果符號的第一幀中:

var juiciness:Number = 6;

在蟲子符號的第一幀中:

this._parent._parent.crunchiness--;
this._parent._parent.sweetness--;
this._parent.juiciness--;
trace(this._parent._parent.crunchiness);
trace(this._parent._parent.sweetness);
trace(this._parent.juiciness);

6
3
5

現在假設我們懶得多次輸入 'this._parent'。我們可以使用 with 來解決此問題

程式碼 結果

在主時間軸的第一幀中

var crunchiness:Number = 7;
var sweetness:Number = 4;

在蘋果符號的第一幀中:

var juiciness:Number = 6;

在蟲子符號的第一幀中:

with(this._parent){
     _parent.crunchiness--;
     _parent.sweetness--;
     juiciness--;
}
trace(this._parent._parent.crunchiness);
trace(this._parent._parent.sweetness);
trace(this._parent.juiciness);

6
3
5

這樣就省去了三次輸入 this._parent 的麻煩。計算機只需要解釋您的程式碼,在程式碼塊中的每個語句之前附加 this._parent 即可。

如果我想將屬性名視為字串怎麼辦?

[編輯 | 編輯原始碼]

有時,我們需要將屬性名視為字串,以便我們可以連線多個字串以形成屬性名。以下是一個示例

程式碼 結果
var currentAnimal:String = "cat";
var dogFood:String = "biscuits";
var catFood:String = "fish";
var fishFood:String = "smallerFish";
trace(this[currentAnimal + "Food"])

fish

在此示例中,我們將 currentAnimal ('cat') 和 'food' 連線起來以形成屬性名 catFood,返回字串 'fish'。[3]

如何透過變數訪問物件的屬性?

[編輯 | 編輯原始碼]

在第二章中,我們學習到,透過將除原始資料型別以外的任何型別分配給變數,我們實際上是在變數中放置指向該物件的連結。我們也可以使用變數訪問物件的屬性

程式碼 結果

在主時間軸的第一幀中

var someFruit:MovieClip = apple;
trace(apple.juiciness);
trace(apple["juiciness"]);

在蘋果符號的第一幀中:

var juiciness:Number = 6;

6
6

我必須知道哪些 MovieClip 屬性和方法?

[編輯 | 編輯原始碼]

以下是本部分其餘部分將使用的一些 MovieClip 屬性。[4]

  • _x 和 _y(都是數字)表示 MovieClip 相對於其父級的定位。請記住,在 ActionScript 中,_y 的值越大,MovieClip 的位置越低。原點 (0,0) 位於左上角。如果您熟悉笛卡爾平面,這可能與直覺不符。
  • _width 和 _height(都是數字)分別表示 MovieClip 的寬度(水平)和高度(垂直)尺寸。
  • _visible 表示 MovieClip 是否可見。如果 _visible 為 true,則 MovieClip 可見,反之亦然。
  • _currentframe 表示 MovieClip 當前所在的幀。

_x、_y、_width、_height 和 _visible 都可以透過為它們分配不同的值來更改。再次開啟包含蘋果的 Flash 檔案,並輸入以下程式碼

apple._x = 100;
apple._y = 200;
apple._width = 100;
apple._height = 100;

您應該會在蘋果的位置和尺寸方面發現明顯的變化(當然,除非您的蘋果碰巧在舞臺上具有完全相同的位置和尺寸!)。

與其他屬性不同,_currentframe 不能用賦值語句更改。相反,使用多個函式來操作當前幀。

  • play()stop() 將分別按順序播放和停止播放幀。預設值為播放,因此,無論何時您想在某個幀處停止,都應新增 stop() 程式碼。例如,如果您在前五幀中沒有任何內容,然後在第六幀中新增 stop(),Flash 將播放到第六幀。
  • gotoAndPlay(frame)gotoAndStop(frame) 將分別轉到指定的幀,然後播放和停止 Flash。如果在 gotoAndPlay 的目標幀上存在 stop() 語句,Flash 將停止,如果在 gotoAndStop 的目標幀上存在 play() 語句,Flash 也將停止。
  • prevFrame()nextFrame() 分別轉到上一幀和下一幀。除非在目標幀上存在 stop() 語句,否則它們將播放。

將在第二部分中介紹更多屬性和方法。

如何呼叫另一個物件的​​方法?

[edit | edit source]

呼叫另一個函式的方法就像訪問它們的變數一樣容易。只需在通常的函式呼叫之前加上相應的變數名稱或地址和一個點。假設我們有一個帶有半咬蘋果的第二個幀,該幀位於我們的蘋果 MovieClip 上。

程式碼 結果

在主時間軸的第一幀中

apple.nextFrame();

在蘋果符號的第一幀中(一個完整的蘋果,包括一條蟲子):

stop();
trace("First frame!");

在蘋果符號的第二幀中(一個半咬的蘋果):

stop();
trace("Second frame!");

第一幀!
第二幀!

在此示例中,當蟲子符號初始化時,它會跟蹤“第一幀!”,但主時間軸會很快使蘋果符號轉到第二幀。

什麼是建構函式?

[edit | edit source]

建構函式是類最重要的​​方法。它用於初始化類的例項。還記得我們在第一章中學到的初始化語法嗎?雖然它對基本資料型別來說非常有效,但它對複合資料型別(您不能直接在其中輸入)來說更加複雜。

我們將在第三章學習如何製作自己的建構函式。現在,讓我們堅持呼叫建構函式。呼叫建構函式的語法如下:[5]

var variableName:DataType = new DataType(parameter1, parameter2);

例如,假設有一個 Dog 類,我們想要建立一個新的 Dog 例項。如果建構函式中有兩個引數,物種和顏色,我們應該編寫以下程式碼

程式碼 結果
//Assume there is a Dog class.
var spot:Dog = new Dog("chihuahua", "black");
trace(Dog.species);
trace(Dog.colour);

吉娃娃
黑色

這會建立一個新的 Dog 類的 spot 例項,其物種為“吉娃娃”,顏色為“黑色”。

當基本資料型別初始化時,也可以將建構函式應用於它們。這將在第二部分中介紹。

可以在變數宣告/賦值語句之外使用建構函式類。這將建立一個沒有溫暖舒適的變數家的例項。

程式碼 結果
trace(new Number());

0

什麼時候不需要建構函式?

[edit | edit source]

首先,基本資料型別通常不需要建構函式,因為它們可以使用它們的文字進行初始化。例如,var someString:String = "Wikibooks" 可以,您不必編寫 someString:String = new String("Wikibooks")。[6]

我們也不需要在 Object 類上使用建構函式。(還記得 Object 類嗎?它是所有類的鼻祖。)相反,它可以像這樣生成:[7]

var variableName:Object = {property1:value1, property2:value2, ..., method1:function1, method2:function2 ...};

function1function2 等應替換為將函式放入變數的語法(我們在函式章節中已經見過)。看看這個例子

程式碼 結果
var someObject:Object = {
     crunchiness:7,
     juiciness:5,
     eat:function(){
          trace("Mmmm! It's " + this.crunchiness + " on the crunchiness scale and "
           + this.juiciness + " on the juiciness scale.");
     }
     };
trace(someObject.crunchiness);
someObject.eat();

7
嗯!在脆度方面為 7,在多汁度方面為 5。

建立一個新物件,其脆度為 7,多汁度為 5。

什麼是 nullundefined

[edit | edit source]

在計算機科學中,如果一個值是 null 或 undefined,則其中什麼都沒有。例如,資料庫表中的鍵欄位必須是唯一的且非空,這意味著它不能為空。在 ActionScript 中,nullundefined 是兩個靈活的、通用的值,可以放入任何型別的變數中。尚未定義的變數(即您尚未為其分配任何值,也尚未呼叫其建構函式)會自動設定為 undefined。Null 和 undefined 被認為是具有正常相等運算子的等效值(即 null == undefined 返回 true),但不是嚴格相等運算子(即 null === undefined 返回 false)。考慮以下示例

程式碼 結果
var someNumber:Number;
trace(someNumber);
someNumber = null;
trace(someNumber);
var someString:String = undefined;
trace(undefined == null);
trace(undefined === null);

undefined
true
true
false

在此示例中,someNumber 最初為 undefined,然後設定為 null。接下來,someString 設定為 undefined。(這只是為了表明 undefined 可以放入任何資料型別中。)最後,發現 undefined 等於 null,但不是嚴格等於 null。

在使用 nullundefined 時,應該更加小心地使用 ! 運算子。

程式碼 結果
var someBoolean:Boolean;
trace(!someBoolean);
var someNumber:Number;
trace(!someNumber);

true
true

在第一個跟蹤中,someBoolean 未定義。!someBoolean 表示“someBoolean 不為真”,這與“someBoolean 為假”不同。由於 someBoolean 未定義,它“不為真”(但也不為假),因此 !someBoolean 為真。還要注意,當一個數字未定義時,可以使用 ! 運算子,如第二個跟蹤語句所示。

筆記

[edit | edit source]
  1. 也可以像這樣定義自己的全域性變數:_global.variableName = value;請注意,全域性變數不是強型別。定義自己的全域性變數是一種不推薦的做法,應該謹慎使用。
  2. 您可以在屬性面板中更改任何 MovieClip 的例項名稱。
  3. 事實上,這種語法比看起來更復雜,但讓我們保持懸念,直到第三部分。
  4. 在 ActionScript 3.0 中,所有前導下劃線都被取消了。
  5. MovieClip 和 TextField 類的例項是用特殊方法建立的。我們將在第二部分中討論它們。
  6. 這兩者之間存在細微差別。“Wikibooks”只是一個基本字串文字,而 new String("Wikibooks") 是 String 包裝類的物件。我們將在第二部分中瞭解更多資訊。
  7. 請注意,括號中包含的部分也被視為物件的文字。
華夏公益教科書