Flash ActionScript 2.0 基礎教程

來源:互聯網
上載者:User
基礎教程

本文譯者:egoldy
文章出處: http://www.ultrashock.com
文章性質:翻譯

ActionScript 2.0-簡介

隨著FLASHMX2004的推出,Macromedia公司推出了一種新的指令碼類型稱為as2,在要教程中我們將要瞭解AS2的新特性。新的物件導向的模型以及如何使AS1的指令碼過度到AS2。

為什麼我們需要一種新的指令碼語言。

如果你只是做一些簡單的動畫是不需要用一種新的指令碼語言的,其實有許多項目是不需要指令碼語言的。如果你真的不需要使用指令碼語言那這個教程將是一個很短的教程,現在你就可以結束了。:)

如果你是一名開發人員,在開發一些比較複雜的項目,那麼AS1就顯得有些力不從心,或者不能勝任。對於使用主流語言如java,c++,c#開發程式的程式員來說AS1是很怪的。他們是要走一些彎路來學習AS1特別是在物件導向編程時。

在as2中這些程式員將發現許多熟知的文法,AS2象JAVA。JSCRIPT.NET和javascript 2.0的程式員將感覺更好,因為AS2的語言基礎來自於ECMASCRIPT EDITION 4.AS2可以使程式員寫出更健狀的程式,也可以吸引更多的程式員來學習FLASH。

好,你可能並不開發程式,那你喜歡開發遊戲嗎。或者是開發互動展示。好訊息是AS2為我們開發這些提供了很有力的支援。

如果你對學習AS2沒有興趣,也不用擔心。因為macromedia保留了AS1文法。你只是不能掌握這種語言的新特性而已。實際上在最後的編譯過程中AS2和AS1都將被編譯為相同的bytescode。這麼做的原因大多是為了相容FLASH6。ok.下面我們將繼續學習。

ActionScript 2.0-AS1.0中的一點點物件導向編程

在我們轉移到AS2之前先讓我瞭解一下在AS1時的物件導向的編程。這一節對於在FLASH5和FLASHMX不太瞭解面向對編程的人來說很重要。如果你已經很瞭解這些可以直接跳過此節。

儘管AS1不是真正的物件導向的程式設計語言,開發人員已經在有些時候使用它進行物件導向的編程了。AS1中的任何東西都是依靠原型鏈也就是對象之間的聯絡。所以在AS1中使用物件導向需要瞭解原型鏈(或者是原型的關鍵字)。

AS1的類就象是規則的函數。方法附加在這個的類的原型上。例如:

// Wizard class
function Wizard() {
}
// help()方法附加在WIZARD函數的原型上。
Wizard.prototype.help = function() {
};

如果我們把help()直接放在wizard class類中。FLASH在尋找屬性和方法時就不會找到它,因為FLASH在尋找是沿著原型鏈進行搜尋的。而在為所有的Wizard類建立一個執行個體copy.下面就是為每個執行個體建立的copy. function Wizard(){ this.help=function(){}}對於java,c#的程式員來說。這樣的將方法代碼放在類中會看來很熟悉,然而為了代碼的可重用性我們還是應將方法附加在類的原型鏈上。 在下面的例子中假如我們針對一個類上有兩個方法,一個是附加在原型鏈上,另一個是直接放在類中,flash將先獲得內部方法。

// AS1_OOP_01.fla
function TestClass() {
this.method = function() {
trace("Internal method");
}; this.prop = ">>> Internal prop";
}// Attach a method to the prototype object of the class
TestClass.prototype.method = function() {
trace("Prototype method");
};TestClass.prototype.prop = ">>> Prototype prop";// Create an instance of the TestClass class
var w = new TestClass();// Internal method is located before the prototype method
w.method();// Replace the Internal method
w.method = function() {
trace("New method");
};
w.method();// Delete the Internal method
delete w.method;// The only method remaining is the prototype method
w.method();// Test the properties
trace(w.prop);w.prop = ">>> New prop";
trace(w.prop);delete w.prop;
trace(w.prop);

上面的例子的輸出內容為:

從上面這個例子我們可以看出在使用AS1面向對向對於初學者來說是極易混淆的。其中知道將代碼寫在什麼位是很重要的,因為它可能經常出現意想不到的結果,正如在商業上有一句流行的話是:但是等等,還有更多。。。。

ActionScript 2.0-AS2.0中的新特性

AS2中的新特性

AS2實際上不是一種新的語言,它是在AS1基礎上的升級,如果你基本上掌握了AS1編程,那麼學習它應是很容易的。接下來讓我們看一下AS2所提供的新東西。

.嚴格的資料類型和編譯提示。

.以資料類型為基礎的代碼提示。

.針對OOP的新的關鍵字和特性。

class、Interface、extends、implements、public、private、static、dynamic、intrinsic、import、class path、get、set

下面就讓我看一下以上這些每一項都有什麼新特點。

嚴格的資料類型

在比較專業程式設計語言中,表達是依靠資料類型的。它給我們的具大的好處是:它可以協助編譯器發現潛在的問題,擷取類型不配的錯誤資訊。它可以使你的代碼清晰易讀。

在AS1中聲明一個變數如count的過程如下:

var count;

在AS2中聲明的過程應是這樣。

var count:Number;

注意,它的文法結構是:<變數>:<資料類型>,這對許多java,c#,c++的程式員來說可能認為有些怪,這實際上是ECMA-262協會制定的規定,macromedia公司是按照這個規定做的而已。

AS2的變數,函數以及傳回值都支援嚴格的資料類型,如下例函數接收字串參數返回一個布爾值。

function func(arg:String):Boolean{};

當一個函數在沒有接收到參數和返回任何值時,使有Void做為資料類型。

function func(arg:Void):Void{};

這種參數被寫空的形式看起來有些怪,但這種用法卻被大量的應用在組件的編寫上,它只意味著當前沒有指定的參數。然而如果你試著將參數傳給這個函數,編譯器在編譯時間是不會出現任何的錯誤提示同時也會將參數進行傳遞的。

儘管AS2支援嚴格的資料類型,卻並沒有被真正的執行這種文法,可是當編譯器發現有資料類型不配的情況時就會出現錯誤提示資訊,使用嚴格的資料來進行編程是一個好的開始習慣。它的好處我們在上面已經說過。如果你使用嚴格的資料類型來編程,那麼你在發布時應指定使用AS2,並且指定發布為FLASH PLAYER 7。

使用嚴格的資料類型,新的編譯器為你提供的了許多新的編譯提示阻止你的影片出現類型不配的錯誤,但在編譯過程中可能要花去較長的時間調試。

代碼提示

在FALSHMX中的代碼提示是依據變數名稱的擴充如myPushButton_pb,mycomboBox_cb中的_pb,_cb來出現代碼提示的,在2004中你會發現大多數的變數擴充不在生效,新版本的AS2以不同的約定型式來出現代碼提示。

當一個變數類型被指定(如果這個變數類型對這個類是有效)方法和屬性的代碼提示會在點的後面出現,否則是不會出現任何代碼提示的。通過指定的資料類型來顯示comboBox的代碼提示如:

var combo:mx.controls.comboBox;
combo.

你可以通過開啟如下檔案查看預設的擴充代碼提示如:

<Flash installation folder>\<language>\First Run\ActionsPanel\AsCodeHints.xml

小提示:在2004中加入FLASHMX的代碼提示

如果你使用2004來編輯你的FLASHMX文檔,你可以將部分的FLASHMX代碼提示加入到2004的代碼提示中。

複製<Flash MX installation folder>\<language>\First Run\ActionsPanel\CustomActions\UIComponents.xml,中的

<codehints>
<typeinfo pattern="*_ch" object="FCheckBox"/>
<typeinfo pattern="*_pb" object="FPushButton"/>
<typeinfo pattern="*_rb" object="FRadioButton"/>
<typeinfo pattern="*_lb" object="FListBox"/>
<typeinfo pattern="*_sb" object="FScrollBar"/>
<typeinfo pattern="*_cb" object="FComboBox"/>
<typeinfo pattern="*_sp" object="FScrollPane"/>
<typeinfo pattern="globalStyleFormat" object="FStyleFormat"/>
</codehints>

這一段到Flash MX 2004's UIComponents.xml檔案的結束標記之前,同樣將這一段複製到2004的AsCodeHints.xml檔案的<codehints></codehints> 之間注意多餘的<codehints>標記要刪除。

現在你就可以在2004中使用FLASHMX的組件代碼提示了。

ActionScript 2.0-針對OOP的關鍵字和特性

下面我們將真正研究一下AS2的特性,在早期往往是在討論AS1複雜的物件導向編程比實際工作更多一些,現在你將很快的看到,你不用花很多時間去爭論怎麼樣做到最好的繼承,將代碼放置在哪和如何組織好你的程式碼程式庫。

讓我們先回顧一下OOP基礎,OOP的最基本單元是對象,它包含兩部分:代碼和資料。由於對象是一種以自己自足的形式出現,因此它的資料和代碼(方法)不需要公開。就象一個黑盒子,對象負責以自身的方法去管理自身的資料,對象與對象之間通過傳遞資訊通訊。這些資訊以公用或公開的方式傳遞和接收。而內部的資料和方法並沒有直接參与其中,這就是OOP的基本原理。

在OOP的設計中,比做是一張大圖,要想到重點和要實現的目標,以及各個部分之間的聯絡。將這張大圖分成小的單元,並且保證各自的自身獨立性,那麼整個項目就很容易完成。而這些小的單元在OOP中就被稱為類。所有這些AS2都提供了很好的支援。

下面這些關鍵字與OOP有關:

class interface extends implements
public private static dynamic
import get set intrinsic

我們不在重複mcromedia的協助文檔中對每一關鍵字的描述,我們可以用執行個體來說明。注意關鍵字intrinsic是mcromedia內部使用的關鍵字。這裡面沒package也就包的關鍵字,但是它與類路徑的工作方式是很重要的,就象是其它語言中的包一樣,如JAVA。

下面我們來看一下例子,在AS1中的類,將其改寫為AS2的類。

// 建構函式
_global.Parent = function(name) {
this.init.apply(this, arguments);
};
// 類的屬性
Parent.lastNames = new Array();
Parent.prototype.init = function(name) {
this.lName = name;
Parent.lastNames.push(name);
this.id = Parent.lastNames.length-1;
trace("Added ’"+ Parent.lastNames[this.id] +"’ at: "+ this.id);
};
Parent.prototype.getLastName = function() {
return (this.lName);
};
Parent.prototype.setLastName = function(s) {
this.lName = s;
Parent.lastNames[this.id] = s;
};
Parent.prototype.getNames = function() {
return (Parent.lastNames);
};
Parent.prototype.addProperty("lastName", Parent.prototype.getLastName, Parent.prototype.setLastName);
Parent.prototype.addProperty("names", Parent.prototype.getNames, null);

上面的代碼改寫為AS2就向下面這樣:

新的關鍵字被應用在如下的例子中:class, private, public, static, get, set

class Parent {
private var lName:String = "";
private var id:Number;
private static var lastNames:Array = new Array();
// 建構函式
public function Parent(name:String) {
init.apply(this, arguments);
}
private function init(name:String):Void {
lName = name;
lastNames.push(name);
id = lastNames.length-1;
trace("Added ’"+ lastNames[id] +"’ at: " + id);
}
public function get lastName():String {
return lName;
}
public function set lastName(s:String):Void {
lName = s;
lastNames[id] = s;
}
public function get names():Array {
return lastNames;
}
}

通過上面的AS1和AS2執行同一個類。我們可以看出二者非常的相似,主要的不同以AS2為例:

1。以外部檔案的形式存在如.as,同時注意類的名稱要與外部檔案名稱相同。
2。AS2區分大小寫,在AS2中object 和 Object是不同的。
3。類的方法定義在類的內部。
4。類的內部不在允許有內部類出現。
5。關鍵字如public,private,static等寫在類方法或屬性的前面。
6。資料類型寫在方法或屬性名稱的後面如:name:string;
7.建立get|set方法更容易使用如下方法:[modifier] function get|set functionName(argument[:type,...])[:type] {}

ActionScript 2.0--THIS的範圍

關鍵詞THIS是可以任意使用的一個關鍵字,您可能也清楚它的使用,但是當一個局部變數和一個類的屬性共用一個名稱時。如果你要指定類的屬性則必須要用this.下面的例子就說明這個問題。

1。建立一個FLASH文檔,選擇ActionScript檔案,如下:

2。將你的檔案另存在你在的工作目錄中名為scopetest.as.就象我們之前提到過的一樣,要將你的類名稱和你的檔案名稱保持一致。

3。輸入如下代碼:

class ScopeTest {
private var myVar:String = "I am the class property!";
public function doTest(Void):Void {
var myVar:String = "I am the local variable!";
trace ("myVar = " + myVar);
trace ("this.myVar = " + this.myVar);
}
}

4。儲存你的檔案
5。建立一個新FLASH文檔,將其另存新檔ScopeTest.fla檔案,且確保和你的類檔案在同一目錄下。
6。在第一幀上輸入如下代碼:

var myTest:ScopeTest = new ScopeTest();
myTest.doTest();

7。測試你影片

ActionScript 2.0--私人或保護

在AS2中需要注意的一件事是私人屬性。就象JAVA一樣,私人成員意味著只有類自身可以訪問。而子類卻不可以訪問,包括是在同一個類路徑或包內。就象其它語言一樣私人屬性多半是為了起到保護作用。

由於這種特性只在編譯時間才會生效,一件非常重要的事情是你必須確保編譯器能正確的獲得私人的方法和屬性。因此注意對你的執行個體名使用嚴格的類型指定,如下我們聲明一個屬性為私人屬性:

class PrivateMemberClass{
private Var privateProp:String="I am a private property";
}

這個私人屬性名稱為privatProp.當你的執行個體名沒有用嚴格的資料類型指定時是可能被執行個體訪問。

var instance=new PrivateMemberClass();
trace(instance.privateProp);

此時將會輸出“I am a private property".

但是如果你使用的嚴格的資料類型指定就會出現編譯錯誤。

如:

var instance:PrivateMemberClass=new PrivateMemberClass();
trace(instance.privateProp);

此時就會出現編譯錯誤。這是許多人常有錯誤,總會問為什麼私人屬性可以被執行個體訪問,現在你知道了。

動態類允許動態對類進行擴充(例如允許加入新的屬性或方法)。象Jscript.NET程式中這種方式稱為expando,如果類不是動態類(象Math類)使用者不能加入新的屬性和方法。而在as1中這其實是很平常的事。就象下面這樣為MOVIECLIP加入新的屬性和方法:

movieClip.protoType.someNewMethed=function(){
一些方法;
}

在as2中這種擴充方式是不允許的。然而我可能通過建立子類的方式加入新的屬性和方法。

下面的例子是我們要擴充靜態類Math中的Max()方法.我們要新將其擴充為在一些數中求出最大的數而不是原先那樣只限定在兩個數中求出最大的數。

dynamic class Math2 extends Math {
// store a reference to Math.max()
private static var oMax:Function = Math.max; // static class cannot be instantiated
private function Math2() {}
// override Math.max(), support any number of arguments
public static function max():Number {
var a:Array = arguments;
var n:Number = a.length;
if (n > 2) {
var m:Number = oMax(a[n-2],a[n-1]);
// remove two elements from the end of the array;
// could use ’a.length -= 2’ as a shortcut as well
a.pop();
a.pop();
a.push(m);
return Number(max.apply(null, a));
} else if (n == 2) {
return oMax(a[0],a[1]);
} else if (n == 1) {
return a[0];
} else {
return oMax();
}
}
}

不象原有的類那樣,現在我們已經對其MAX()方法進行了擴充將其變成了動態類。並且形成了新的類名為math2.

現在可以試一下了。


trace(Math2.max(70,6,3,12,82,9,28,5));

ActionScript 2.0--繼承

正如前面提到過的。繼承對於OOP編程是很重要的儘管它不是絕對的需要。它用來定義子類與超類之間的關係。AS2為實現這一目的設定了一個新的關鍵詞:extends.在上一例中的Math2中我們已經使用的了extends這一關鍵字繼承Math類。它還是比較簡單的。

在建構函式時首先應注意的是super()關建字。它的作用是調用超類的建構函式,如果你之前沒有在超類中建構函式那麼FLASH會自動產生一個空的建構函式。

值得欣慰的是許多BUG在新版的flash player7中已經被修複。但在FLASHPLAY6仍有bug的問題,如果你不太清楚,可能查看AS1中有關繼承bug的相關列表文章。

如果你想要從子類傳遞參數給你的超類,你應確保在你的超類中已有了這些參數的聲明。否則你會發現為什麼只有部分的參數被傳遞。如我們要建立一個子類名為Child,它繼承自他的父類。我們應在建構函式中這樣寫:


class Child extends Parent {
private var fName:String = "";
public function Child(lname:String, fname:String) {
super(lname);
// continue Child’s constructor code
fName = fname;
}
}

ActionScript 2.0--匯入外部的類檔案

為了更好的組織類和避免類名稱的衝突.被許多語言應用的概念包被引入.ActionScript 2.0引入包就是為瞭解決這個問題.

類名稱的衝突是指什麼呢?我們假想有兩個開發人員,每個人都建立了一個程式碼程式庫.在庫中都有一個名為utility的類.如果這兩個程式碼程式庫合在一起使用,這時就會造成flash的混亂,不知使用哪一個庫中的類.

這時類路徑及來出來挽救,通過將路徑合并到類名稱中.就象是硬碟中的檔案一樣,在不同的目錄中可以有相同的檔案存在.要指明引用哪一個類.要在匯入處理程序中使用正確的類路徑.如:

import mx.events.Eventdesign;

一旦類被匯入,我們在引用類時就可能只接使用類名稱而不需要使用類的路徑了.

class MyBroadcaster {
public function MyBroadcaster() {
EventDesign.initialize(this);
}
}

當然,你也可以不用匯入的方式,而是在每次使用時都指明類的正確路徑.可這樣做會使人很煩的.當多次使用時要不斷的輸入重複的東西.

class MyBroadcaster {
public function MyBroadcaster() {
mx.events.EventDesign.initialize(this);
}
}

當在建立自已的類時,將你的類放在一個指定的項目目錄中,或是放在一個公用的類庫中,而不要將其放在

<Flash install folder>\<language>\First Run\Classes\) 或<drive>:\Documents and Settings\<user>\Local Settings\Application Data\Macromedia\Flash MX 2004\<language>\Configuration\Classes\).

這樣做可以使執行同步同時減少編譯時間錯誤的出現.一種公用的方法是使用你的反面的網域名稱作為類的路徑如

import com.quantumwave.alliance.rebel.Commander;

如果要匯入路徑中的所有類.使用萬用字元*,如下:

import com.quantumwave.*

這一步匯入將匯入com.quantumwave下的所有的類但在編譯時間只編譯使用到的類,所以你不必擔心匯入所有的類會增大你檔案的大小.

ActionScript 2.0--介面

當在使用OOP時,除了繼承比較重要之外,在就是介面了.就像JAVA和C#,ActionScript不提供多重繼承(如一個子類可繼承多個超類),這是因為如果使用不當在調試時就會象做了一場惡夢一樣.會造成死迴圈和粘連不清的情況,在精心設計你的項目時,使用介面可以同樣達到多重繼承的效果,而不會出現上面說的那種很麻煩的情況.

一個介面就象是各類在執行方法時的一種協議,而通常在各個類未執行方法時是沒有聯絡的.在介面中沒有代碼沒有屬性,只有方法,它的書寫方式完全就象是在書寫一個類一樣,除了:

1.它們都沒有屬性

2.它們只有方法的標記,參數,類型和返回的類型

3.在方法定義的結尾只有小括弧而沒有大括弧

下面是一個可拖動的類名為Dragable的範例(通常在命名介面時通常以大寫的"I"開頭).

interface IDraggable {
public function startDrag():Void;
public function stopDrag():Void;
public function isDragging():Boolean;
}

如果要使用Interface需要使用關鍵字implement.如下面的例子,child類繼承超類同時使用介面IDraggable.

class Child extends Parent implements IDraggable {
public function Child() {
// add Child constructor code
}
public function startDrag():Void {
// implement the code for startDrag();
}
public function stopDrag():Void {
// implement the code for stopDrag();
}
public function isDragging():Boolean {
// implement the code for isDragging();
}
}

唯一在使用介面時注意的事情是,在類中應使用與介面中一樣的方法,參數類型的定義,通過這種方式介面可以在兩個不一樣的程式員之間標準化代碼,當一個已知的介面被類使用時,和序員只需知道介面以在不同的類中使用.



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。