ActionScript 3.0動畫基礎-3

作者: egoldy

性質: 翻譯

閱讀次數: 17916

發表時間: 2007-06-26 15:14:42


聲明: 此文章為未出版的keith peters的ActionScript 3.0 making things move中文版樣章。為書中的第二章。webstudio會在中文版出版之際,友情提供論壇forum支持。轉載請注明出處,謝謝!



接上一篇.....

2.5使用代碼動畫

好,現在你應當已經理解了關于如何在AS3編碼的足夠多的基礎知識。你已經選擇一種開發環,你已經準備好開始了。下面讓我們深入到一些ActionScript動畫內容。

2.5.1循環

幾乎所有的動畫編碼都包含一些循環。如果你想到一個逐幀動畫,你可能需要有一個流程,它們將是一系列象位圖一樣的內容,每一幀都是一副圖像并且只是需要顯示而已,如下圖2-3。

/media/upload/2007/06/26/3.jpg
圖2-3.逐幀動畫

當你在Flash中進入到圖形或是元件符號中,可能情況會有些不同。Flash不能每一幀創建和保存一張新的圖像,即使是在逐幀動畫中。在每一幀 上,Flash保存著舞臺上每個對象的位置,大小,顏色等等。因些,如果你有一個穿過屏幕的小球,那么每一幀將會保存當前幀上小球的位置。可能第一幀小球 位于距左邊10像素的位置,第二幀可能就是15像素,如此這樣。Flash 播放器讀取到這些數據,根據這些描述來設置舞臺,并且顯示幀。根據這些,你可以得到另外一擴展后的流程,如圖2-4所示。
但是當你思考如何描述一個動態的,ActionScript動畫時,它的流程看起來是這樣的。如圖 2-5.

/media/upload/2007/06/26/4.jpg
圖2-5. 腳本動畫

如你所見到的圖2-5,沒有第一幀,第二幀的概念等等。ActionScript動畫一般可以做到,通常都是這樣,只在一幀上發生。這里你可以開始了解我的說的循環。
首先,你設置一個初始化狀態。你可拖動一個影片剪輯到舞臺上,如同你要創建一個補間動畫。或都你可以只用代碼描述整個場景。不管是哪種方法,你都要渲染和顯示幀。
接下來,應用你的規則。這個規則可以簡化為,“這個小球向右移動5個像素,” 或者他們可以使用復雜的三角法來制作成許多線。本書中的范例將會涉及這些范圍。
應用規則將會得到一個新的狀態—一個新的被渲染和顯示的描述。然后不斷重復的應用相同的規則。
注意那是相同的一組規則被重復的使用。你不需要為第一幀設置一組規則,然后在為第二幀設置另一組規則,如此等等。因此,你的任務的是設置一組規則 它可以應付你場景中所有可能的情況。當發生了小球快速的移動右邊并移出屏幕怎么辦?你的規則需要考濾到它。你是否允用戶使用鼠標與這些小球進行交互?你的 規則同樣需要將它考濾進去。
它看上去有些讓人害怕,但實際上它并不是真的那么復雜。基本上你都可通過一個或兩個規則創建一些非常簡單的行為,當它們可以正常工作時,在加入其它的規則。

這里面的”rules”規則,我一直這樣叫它們,實際上就是指ActionScript聲明。每一個規則可以是一個單一的聲明或幾個組合再或者是許多聲明。在這個例子中小球向右移動5個像素,它的規則看上去如下樣子:

ball.x  =  ball.x  +  5;

你只是指出了小球的x位置(水平方向),增加5,來產生一個新的x位置。你可以更簡單寫在如下代碼:

ball.x  +=  5;

+=操作符只是將右邊的值增加到左邊的變量中。并將結果指定給變量。
下面是本書中稍微高級一點的一組規則的應用。你稍后會在書的后面看到:

var  dx:Number  =  mouseX  -  ball.x;
var  dy:Number  =  mouseY  -  ball.y;
var  ax:Number  =  dx  *  spring;
var  ay:Number  =  dy  *  spring;
vx  +=  ax;
vy  +=  ay;
vy  +=  gravity;
vx  *=  friction;
vy  *=  friction;
ball.x  +=  vx;
ball.y  +=  vy;
graphics.clear();
graphics.lineStyle(1);
graphics.moveTo(ball.x,  ball.y);
graphics.lineTo(mouseX,  mouseY); 

現在不要提心它們是什么意思,只要知道Flash將需要運行這樣的代碼來生成每一個新的幀。
那么,你是如何讓他們循環運行的呢? 我將展示給你我的第一次嘗試,它也會是許多初學ActionScript的用戶易出現的錯誤。它是基于幾乎所有的程序語言中都有的基本循環架構,如for 和while。你可以使用它們中的一種架構來設置循環,它將會使代碼在其內容重復執行。這面是我所做的:

for(i  =  0;  i  <  500;  i++){
ball.x  =  i;
} 

它看上去非常的簡單。變 量i的初始值為0,小球影片剪輯放在舞臺上x軸0的位置。i++會使變量i在循環時每次都增加1,從0到1到2,3,4,如此等等,每執行一次,值就會指 定給ball.x,讓它從舞臺的左右移動它到右邊。當i達到500時,i<500的聲明就會變成false,循環就會停止。
如果你也范過同樣的錯誤,你可能知道小球是不會穿過舞臺的---它只是簡單的直接顯示在右邊。為什么沒有發生中間的移動過程呢?好,實際上它做了!你只是沒有看見而已,因為你從來就沒有讓Flash更新屏幕。圖2-6是另一個流程來顯示所發生的本質。

/media/upload/2007/06/26/5.jpg
圖 2-6.為什么你不能使用for來動畫

你確實應用了規則并且移動了小球的位置,創建的500次的新場景。但是直到循環結束時它才得以顯示。這是因為Flash只是在最后一幀的時候才更新了場景。這是非常重要的一點。
這里是每一幀執行動作的順序:
1.在舞臺上放置好所有物體的位置,包括任何級別,任何層,載入影片剪輯,如此等等。
2.執行那一幀上所有需要被調用的ActionScript,包括任何層或級別上的任何影片剪輯或按鈕,或是嵌套的影片剪輯,無論有多深。
3.檢查是否有時間來顯示幀。如果你設置了幀頻為每秒20幀,Flash將檢測是否在至少50毫秒的時間可以顯示一個幀。如果可以,它將顯示剛剛渲染的這一幀并且移動到下一個幀。如果不可以,它將等待直到正確的時間數量都過去。
你需要知道一些關于時間因素的問題。首先,幀頻率從來都是不精確的(即便是現在的Flash Player 9影片)。不要指望他們會有嚴格準確的時間。第二,很可能出現渲染或ActionScript執行的時間超過分配給每一幀的時間。你不必擔心你的腳本會被 裁切掉,而Flash會在移到上面的第三步之前完成腳本的執行(第二部),盡管它會慢于幀頻率。Flash其實會在指定的幀上為完成你的腳本等待15秒。 它將會顯示出一行提示信息”一個腳本導致了播放器運行緩慢……”等信息。
在前面的范例中,Flash在進入到下一幀之前,在等待For 循環的結束,并且它只在去往下一幀之前才更新屏幕。這就是為什么你只看到了一個跳躍,而不是移動。
因此,你所需要做的就是通過幀打破這種循環,因此你需要回到如圖2-5所示的流程。

2.5.2幀循環

因為這本書并不是講關于處理時間線和單獨某一幀上的內容,所以我不打算給出一個確切的幀循環的例子;而在這里,我只是描述這個概念。如果你使用的是Flash CS3 IDE,它可能是一個很的教學來真正的開始你自已的范例。
說到幀循環的思路我們要回到早期版本的Flash,當時ActionScript并不象今天這樣強大。它的思路是將一些代碼放在一個指定的幀上, 然后在另一個幀上放一個語句,通常是gotoAndPlay,它可以讓播放頭回到前一幀上。這樣就在兩幀之間形成了一個無窮的循環,每當播放頭播放到有代 碼的幀時,就會執行幀上的代碼。
比較重要需要注意的是因為它有兩幀,代碼被執行,屏幕被更新和顯示,以及播放頭的移動。這樣屏幕會在每次重復執行代碼時刷新,你就得到了動畫。
例如,在你的舞臺上有一個影片剪輯名為ball。那么第一幀上的代碼應是象這樣:

ball.x  ++;

第二幀的代碼這樣:

gotoAndPlay(1);

實際上,在這個例子中第二幀可以什么也沒有,因為時間默認狀態下會自動的回放。
作為對這個例子的變換,你可以設置為3個幀,第一幀是一個初始化幀,你可以在它上面放置只運行一次的任何代碼,而不是循環。第二幀將包括主要的動作,第三幀為gotoAndPlay(2);
第一幀可能設置了小球的初始化位置,改變小球的顏色或大小,或做其它的什么都將只發生一次。時間線會在第2幀和第3幀之間無究的循環,運動動畫和更新屏幕。
在早期的Flash 5或更早的版本中,這是一種被廣范使用的方法,雖然現在看它有些不流行了,但它仍工作的很有效。盡管是這樣,你很快就會發現更靈活和更有力的設置方法,它 非常的有教育意義,可以看到影片的不同側面—初始化,動作,和循環---這些概念將在你后面學習每一個動畫設置過程中都會繼續使用。

2.5.3剪輯事件(Clip events)

感到欣慰的是剪輯事件(Clip event)已完全從AS3中移除了,但是仍執得做為一個腳注引起我們的注意。回到Flash 5的那段時期,剪輯事件(clip event)是幀循環最主要的選擇對角。
剪輯事件(clip events)是指放置的代碼,并不是放在時間線上,而是直接將代碼放在影片剪輯自身上。它的操作方法是選擇舞臺上的影片剪輯然后打開 ActionScript面板。當打開面板后在ActionScript面板上輸入你的代碼。當你在做這些并在ActionScript面板上輸入代碼 時,這些代碼就被直接指定給了那個影片剪輯。
我說這些代碼被加在了影片剪輯”上”(“on”)。任何和所有的代碼都在一個剪輯上并在clip event代碼塊中顯示,它看上去象這樣:

onClipEvent(eventName){
//  代碼寫在這里
} 

除了onClipEvent(eventName)之外,還有on(eventName),這個”on”事件還作用于鼠標和鍵盤動作,如按下(press)和松開(release)。
事件名稱是指許多可能在Flash影片中發生的事件中的一種。一個事件可以簡單描述為:影片中發生的一些事情。事件可以分為兩大類別:系統事情和 用戶事件。一個系統事件是指當一些事情發生在計算機內,Flash,或你的影片中,如象是數據正在載入,內容正在載入,或一個新的幀正在開始播放。用戶事 件是指用戶已經做的一些事情,通常是指鍵盤或是鼠標活動。
對于剪輯事件來講最常用的是load和enterFrame。Load事件發生在當一個影片剪輯實例第一次出現在舞臺上并且任何實例都只運行一次。你只需要簡單的將你的代碼放在兩個小括號中即可:

onClipEvent(load){
//  初始化代碼
} 

enterFrame事件發生在Flash每次準備開如渲染下一幀時,即便是只有一幀的影片。例如,如果幀頻率設為每秒鐘20幀,enterFrame將 會大約每隔50豪秒運行一次。這個enterFrame 剪輯事件就是你經常應用“規則(ruler)”或動作代碼的位置,因為你有兩個需求:重復代碼和每次執行后的重新顯示。它看上去如下:

onClipEvent(enterFrame){
//  動作代碼
}

這樣,你將一個影片剪輯放置在時間線上,然后將下面的代碼加在上面(注意這里是早期的AS 1語法):

onClipEvent(load){
this._x  =  100;
this._y  =  100;
}
onClipEvent(enterFrame){
this._x  +=  5;
} 

另外,本書中的范例并沒有使用這種設置方式(因為它不在是AS3語言中的一部分),但是有三個要點需要注意,初始化,重復動作,和屏幕刷新,它將是你在任何系統中制作任何動畫的一部分。

2.5.4事件(events)和事件句柄(event handlers)

Flash MX 在ActionScript上引入了許多重要的改變---最大的改變和提升是將Flash帶入到富應用開發的前沿。其中的一個最大的改變是新的事件架構,相比較之前的版本可以做出更為復雜的應用程序。
我已經介紹了一些關于事件的內容,它發生在當系統有一些事情發生或是用戶通過鍵盤和鼠標做某些事情時。在Flash MX之前,唯一的方法是通過onClipEvent(eventName)或影片剪輯和按鈕上的on(eventName)代碼塊來捕獲事件。這意味著你 不得不在創作時在舞臺上放置一個影片剪輯并在它上面編寫代碼。盡管各種方法已被發掘,但沒有一種是最理想的。MX的事件架構不能說是最好的,但是相比之前 的版本而言它有一個很大的提高并且允許你從程序中的任何位置訪問事件,在任何時候可以停止指定的事件,或是動態的改變一個事件的行為。你可以想象對于這種 功能的提供它是多么的強大和靈活。
隨著Flash MX 2004的到來,在事件架構中增加了組件框架來提高事件機能。然而,這種增強只是在原有的事件架構基礎上通過增加AS2 類來實現的。這些類提供了許多附加的事件操作,對于某些情況下AS2類償試提供的機能在事件架構的底層仍顯得功能不足。
在AS3中,事件架構已經從最底層重新寫過。它的速度是很快,強大,并且完全與Flash播放器集成。
要理解事件,你需理解另外兩個概念:偵聽者(listeners)和handlers(處理者,也有稱為句柄的)。偵聽者和處理者是真正的一對好 名字,因為那就是他們所做的工作。一個偵聽者(listener)是一個對象,它負責偵聽事件。一個處理者(handler)是一個函數,當事件發生時它 負責處理事件。偵聽者(listener)和處理者(handler)在整個ActionScript歷史中它們的執行是有很大不同的,它們甚至在As2 內的執行也會有不同。為了避免混淆,我將直接講解AS 3,在AS3整個系統中它會更純粹,更漂亮和協調。

2.5.5    偵聽者(Listeners)和處理者(handlers)

按照常規,一個偵聽者是一個對象,負責偵聽事件。你可以通過調用名為addEventListener的函數來指定你的類做為一個偵聽者,偵聽指定的事件。你需要傳遞想要偵聽的事件名稱和類中的將要被處理的函數名稱。下面是一個例子:
addEventListener("enterFrame",  onEnterFrame);
當在加入事件偵聽者時還可以加入其它的附加參數,但我們在這本中并沒有這樣做,上面的語法是你在大多數的事件應用中所必須的。
注意事件的名稱,“enterFrame”,它是一個字符串,這是我們都知道的,還會帶點輕視,它是一個神奇的字符串。為什么神奇?因為如果你意 外的把它寫錯成”entorFrame”,編譯器會沒有任何提示神奇的接受它,即便是沒有這樣的事件名稱,然后你將花上幾個小時時間來解決一個神奇的問 題,那就是為什么你的事件函數沒有被調用。
但是AS3已經有了對此的處理方法。你可以使用Event類的屬性,而不是去使用象“enterFrame”這樣的神奇字符串。例如,在上面的例子中,你可以按下面的方式書寫:

addEventListener(Event.ENTER_FRAME,  onEnterFrame);

如果你去查看Event.ENTER_FRAME的屬性值,會發現它其實就是一個簡單的字符串“enterFrame”。現在,你可能會想這種方式同樣會 非常容易寫成Event.ENTOR_FRAME。但是這里的改進是如果你寫錯了,你的程序將拒絕編譯并會正確的告訴你在Event類中沒有那樣的屬性。 它不但會精確的指示出你錯在第幾行,而且也會精確到這一行的哪一個單詞上。它可以說好的不能再好了,除非有一天編譯器可以更改你的錯誤,并且能為你寫代 碼。
除了Event類的事件類型外,在其它類中還有其它的事件類型,如 MouseEvent.MOUSE_DOWN,KeyboardEvent.KEY_DOWN,TimerEvent.TIMER,如此等等。而他們都等 同于簡單的字符串如“mouseDown”,“keyDown”,and“timer”,最好的方法是你可以忘記這些字符串而只使用屬性。
下一個需要知道的重點是有些時候,如前面的例子,你可以在一個類中直接調用addEventListener函數。在這個例子中,你實際上是告 訴這個類偵聽它自身的enterFrame事件。在有些案例中,你想偵聽由其它對象產生的事件。例如如果你有一個名為mySpriteButton的精靈 (sprite),用它來做為按鈕使用。當用戶點擊這個精靈(sprite)時,它將產生一個mouseDown事件。要偵聽來自這個精靈 (sprite)的mouseDown事件,你需要調用那個精靈(sprite)的addEventListener方法,如下:

mySpriteButton.addEventListener(MouseEvent.MOUSE_DOWN,  onSpritePress);

最后需要注意的事情是它不象之前版本的ActionScript,必須要用指定的事件處理函數名稱如onEnterFrame,在AS3中當你加入偵聽者 時,你可以為你的事件處理函數命名任意的名稱。在enterFrame的范例中,我使用onEnterFrame做為一個處理者(handler),那只 是因為它比較適合我并且習慣于這樣使用它。在AS3中,onEnterFrame已不在是固定不變的。我可以很隨意的將enterFrame處理函數命名 為move,run或doSomethingColl。然而按照慣例,事件處理函數通常是以on開頭,后面跟隨著事件的描述和可能來自于哪兒,如 onStartButtonClick,,onConfigXMLLoad, 或 onRocketCrash。還有一些人喜歡在事件名稱后面加上Handler后綴來做為事件處理函數名稱----例 如,enterFrameHandler。 那么,這只是一個偏好的問題,最重要的事情是保持一致性,你只要能做到一看到它就知道它是事件處理函數即可。

現在,我已經講解了偵聽事件的偵聽者,但是可能有更準確的關于偵聽者(listener)的描述:即被通知的事件。在內部,產生事件的對象保存為 一個列表,每個對象已加入自身做為一個偵聽者。如果一個對象能夠產生不同類型的事件,如mouseDown,mouseUp,和mouseMove,它將 會為它能產生的每一種事件類型保存一個偵聽者列表。無論什么時候事件發生時,對象就會在相應的列表中運行一遍并且讓列表中的每一個對象知道有什么事件發生 了。
另一種描述事件的方法可以說成是變成一個偵聽者的對象正在提交一個指定的動作。同時產生事件的對象正在向所有的提交者廣播事件。
另外,如果你不在想讓一個對象偵聽事件,你可以告訴它停止偵聽,或停止提交,通過調用removeEventListener方法來完成:

removeEventListener(Event.ENTER_FRAME,  onEnterFrame); 

這就是在告訴對象從自身的偵聽指定事件的偵聽者列表中移除偵聽者,因此它將不會在接受到其它任何的提醒。
讓我們繼續來看一些具體的應用。下面的代碼創建一個新的精靈(sprite),將它放在舞臺上,在它內部繪制一些圖形,然后加入一個事件偵聽者。以之前的基本的程序框架開始,加入代碼如下:

package  {
import  flash.display.Sprite;
import  flash.events.MouseEvent;

public  class  EventDemo  extends  Sprite  {
private  var  eventSprite:Sprite;
public  function  EventDemo()  {
init();
}
private  function  init():void  {
eventSprite  =  new  Sprite();
addChild(eventSprite);
eventSprite.graphics.beginFill(0xff0000);
eventSprite.graphics.drawCircle(0,  0,  100);
eventSprite.graphics.endFill();

eventSprite.x  =  stage.stageWidth  /  2;
eventSprite.y  =  stage.stageHeight  /  2;
eventSprite.addEventListener(MouseEvent.MOUSE_DOWN, onMouseDown);
eventSprite.addEventListener(MouseEvent.MOUSE_UP, onMouseUp);
}
private  function  onMouseDown(event:MouseEvent):void  {
trace("mouse  down");
}
private  function  onMouseUp(event:MouseEvent):void  {
trace("mouse  up");
}
}
} 

怎么理解呢?init函數的最主要的作用是創建一個精靈(sprite),然后在里面繪制一個圓形,然后將它對齊在舞臺的中心。最重的是最后兩行。這個類 將它自已加入作為一個偵聽者,來偵聽兩個事件,MOUSE_DOWN和MOUSE_UP。注意它們是MouseEvent類的屬性,MouseEvent 類必須要先導入。作為處理者(handlers,也有人稱為句柄),你傳入onMouseDown和onMouseUp函數,他們要放在后面。處理者 (handler)通常接收傳過來的一個包含事件信息的對象。簡單講,它將包括一些對象觸發事件的信息。在本例中的鼠標事件,它包括在事件發生時鼠標的位 置,哪個鼠標按鍵被按下,等等信息。對于鍵盤事件,它將包括在事件過程中哪個鍵子被按下;其它按鍵的狀態,如Ctrl,Alt,和Shift鍵。可以參考 幫助文件來查看各種事件類型所包括的信息。
保存上面的例子為EventDemo.as文件并使用你選擇的編譯環境來編譯它,如前面的描述,當你運行SWF時,你將會看到每當你在新的精靈 (sprite)上按下或放開鼠標時,就會在輸出面板上輸出相應的信息。如果你使用的是Flex Builder 2,不要忘記是調試(debug)---而不是運行---你的程序,如果你使用的是免費的SDK,使用正確的trace方法來解決。確保你可以讓它正常的 工作。它是一個非常簡單的例子,但是它可以很好的來檢測你的開發環境是否配置正確。

如果你剛剛接觸到ActionScript,你已讓它正常工作并且真正的理解了它,那么恭喜你,你已經從入門級上升到中級狀態了。
OK,現在你已經知道一些關于處理者(handlers)了,你可以更好的理解偵聽者(listener)。在前面,我說過它是一個對象,產生事 件廣播事件,或通知它的事件偵聽者。它是怎樣做的呢?好,它準備好所有它要做的就是調用對象的函數。對象需要有正確的處理者(handler)名稱。在前 面的例子中,EventDemo類將它自已加入做為一個偵聽者,來偵聽精靈(sprite)的兩個事件。在內部,精靈(sprite)為每一個事件保存了 一個列表。那么它有一個mouseDown事件列表,還有一個mouseUp事件列表。它們可能只是一個簡單的數組。每一個列表中包含一個主影片的引用, 也就是EventDemo類的一個實例。
當用戶在精靈(sprite)上點擊鼠標時,精靈(sprite)就會作出反應,“哇,鼠標按下了!必須要通過偵聽者!”(或者是其它象這樣的 什么)。然后它就會跑到mouseDown列表中并查看有什么在那里。精靈(sprite)發現有一個主影片的引用和一指定作為處理者(handler) 的函數的引用在那里。在這個例子中那個函數名為onMouseDown。然后它就簡單的調用偵聽者的函數。如果有其它對象注冊成為mouseDown事件 的偵聽者,他們也將在列表當中,它們已定義的處理者(handle)也將被調用。
同樣的事情也會發生在鼠標抬起的動作,只是它們在mouseUp列表中。
在AS3中的需要注意一個重要技術就是最大的范圍問題得到了全部的解決。這個問題有些復雜,但是一個簡單的理解它的方法是哪里的事件函數在什么時 候被調用。盡管AS2事件架構表面上看與AS3非常相似,在AS2中類的方法要做為事件函數被調用,只有當它是一個正在被調用對象的方法時才會執行。而不 是在類中定義的對象。如果這看上去讓你很糊涂,這就是它真正問題的原因,并且有一個整個的類---委派(Delegate)類---被創建只是用來試著解 決這個問題的。如果這一段讓你感覺很沒趣,放松并且值得欣慰的是你不需要在AS3中再去想這些問題了。
以上這些就是事件和事件處理函數的基礎。我們隨著我們的進度繼續介紹一些事件,但是現在,讓我們回到動畫上。

2.5.6動畫事件

如上面我們談論的所有關于事件的問題把我們帶到哪兒了呢?我們正在尋找一種能夠將代碼應用到動畫一個物體和重復刷新屏幕的方法。在前面,你已看過一個使用enterFrame的clip event來動畫的范例。讓我們以這項技術來做為開始。
在AS3中,你可以加入一個偵聽者(listener)來偵聽enterFrame事件如下:
addEventListener(Event.ENTER_FRAME,  onEnterFrame);
記得你需要先導入Event類并且創建一個真實的名為onEnterFrame的方法。
有一點會經常使人們糊涂,那就是當影片只有一幀的時候,你的enterFrame事件仍會正常的工作。(并且如果你正在使用Flex Builder 2或是SDK,你是看不到任何幀的,但是它確實是一個事實,它確實存在在那里)播放頭并不是真正的進入到一個新的幀上;它只是停在第一幀上。意識到 enterFrame事件并不是移動播放頭到一個新的幀。而更多的是圍繞著---事件告訴Flash什么時間移動播放頭。可以把enterFrame想象 為一個定時器,只是不是很精確。Flash會根據幀頻率的設定來檢測要每隔多少長時間進入到一個新的幀上。然后它就會在內部重復的執行事件。如果有其它的 幀可以去,它就會播放到那里。還有一點就是,你可以計算出事件重復執行的次數。
原書p36圖字
( 如果你對Flash的內部工作過程非常的感興趣,你可以查看Tinic Uro的Blog,地址是www.kaourantin.net。Tinic是一位在Adobe工作的Flash播放器開發工程師,經常發表一些對于 Flash場景背后是怎樣工作的一些深度解釋。)
在前面的范例中已經有了初始化代碼,要么是一個初始化幀再或者是在一個onClipEvent(load)代碼塊中。你可能已經猜到了,這些代 碼都可以在init方法中發生。Init方法只能能過構造函數調用一次。你需要習慣init方法在你的影片中不會第二次被調用。如果你需要重新初始化某些 變量或調用其它方法,那么就把它們放在其它的函數中并且在你需要的時候調用它們。
下面是我們第一個基于AS3的動畫范例!

package  {
import  flash.display.Sprite;
import  flash.events.Event;

public  class  FirstAnimation  extends  Sprite  {
private  var  ball:Sprite;

public  function  FirstAnimation()  {
init();
}
private  function  init():void  {
ball  =  new  Sprite();
addChild(ball);
ball.graphics.beginFill(0xff0000);
ball.graphics.drawCircle(0,  0,  40);
ball.graphics.endFill();
ball.x  =  20;
ball.y  =  stage.stageHeight  /  2;
ball.addEventListener(Event.ENTER_FRAME,  onEnterFrame);
}
private  function  onEnterFrame(event:Event):void  {
ball.x++;
}
}
} 

Init函數創建一個名為ball的精靈(sprite)并且設置了事件偵聽者。onEnterFrame函數用來實現動畫,移動小球,之后屏幕會被刷新。它并不是很復雜,但是這是本書中所有其它內容的基礎,所以要很好的理解它。
好,我們已經涉及了很多的關于如何架構ActionScript動畫的內容。解釋了如何應用規則來不斷的重復運行,以及如何在應用了程序規則后更 新屏幕來產生運動錯覺。但是你能用它來移動什么呢?目前為止,你已經可以移動一個精靈(sprite),但是目前的所有代碼只是簡單應用在一個影片剪輯 上。下一步,我們將研究如何創建精靈和影處剪輯并使用顯示列表(display list)來使用顯示。

未完待續

 

討論此教程

服務項目_SERVICE

關于我們

萬博思圖(北京)信息技術有限公司,專業的flash,flex開發團隊,5年經驗。公司致力于互聯網上的業務的開展,對于互動網站行銷,互聯網應用程序開發有成熟的解決方案。我們關注互聯網市場動態,關注新技術,更注重在新的領域不斷探索發現。
萬博思圖業務內容主要包括企業品牌Flash網站開發,企業形象宣傳Flash設計,動畫,多媒體演示,Flex企業級應用程序開發,擁有眾多成功案例,歡迎來電咨詢。
 
COPYRIGHT BY WEBSTUDIO INTERACTIVE DESIGN Co.,Ltd. ALL RIGHTS RESERVED.
公司地址: 北京市朝陽區光華路15號院泰達時代中心4號樓704 郵編: 100026 EMAIL: [email protected]
電話: 010-59070059   (新號:010-59897050 010-59897060)  手機: 13693660520 傳真: 010-59070059-801
京公網安備:110108006741      京ICP備:05013074號-1
王先生
浙江6十1开奖结果规则