Actionscript中的進階路徑

來源:互聯網
上載者:User
進階 難度: 中級
軟體環境: Flash 5


可以告訴我,你讀了多少篇我寫的路徑教程?嗯,一點點吧。如果將你所學的知識模組化,並可以隨時隨地用你所學,那不是很好?當然,手工輸入的路徑並不是精闢的指令碼。所以我們今天要更進一步,學習真正的路徑。

動態路徑(數組標識方法)

假定你寫了一段進階指令碼,用來複製若干個movie clip,並將它們隨機放置在舞台上。做得不錯!現在我希望你瀏覽一下你的指令碼,並讓他們精簡一半。”我可以做到”你邊說著,邊寫代碼:

_root.duplicate1._xscale = 50;_root.duplicate1._yscale = 50;_root.duplicate2._xscale = 50;_root.duplicate2._yscale = 50;_root.duplicate3._xscale ...

已經開始無聊了吧?我知道我會。當然,我們不希望為這累人的活寫上若干條代碼。如果你讀過迴圈教程,你就會知道這樣的例子用迴圈語句相當合適了。下面是改用迴圈語句寫的代碼:

for (var j=0; j<x; j++) {_root.duplicate ... oh oh

果真如此嗎?我們都知道你想複製若干次……但是如何告訴Flash知道呢?好,現在你可以用動態路徑來解決。在Flash 4裡,當我們想計算一個動作或程式的結果時,我們使用eval()函數。今天,我們要使用方括弧( [ ] )。你我都認識這些括弧:我們在使用數組的時候用到它們。事實上,動態路徑與訪問數組中的對象兩者異不大。想法就是我們賦予Flash一個基準的時間軸, 用它來尋找元素,這些元素的名字是從那些一個或更多未知的單元組合起來的(變數、數學運算結果等等)。在上面例子中,我們的變數j聲明了當前我們希望應用效果的複製品。我們也知道那些複製品的名字是以duplicate1、duplicate2這樣的格式。所以我們就需要告訴Flash將數字i串連到字串”duplicate”後面。別擔心,很容易的,讓我們來看看例子。

for (var j = 0; j<x; j++) {
_root["duplicate"+j]._xscale = 50;
}

我想這段代碼大部分樣子,你先前是見過的。For迴圈你是知道的,第二行最後的點符號也很熟悉,但是第二行的前面部分,有點生疏,好,我現在來解釋一下。簡而言之,它告訴Flash:”注意_root時間軸上的對象,它的名字是由字串”duplicate”與串連在其後的數值i組成”。注意,在_root與左方括弧之間缺了一個點;這不是語法錯誤,這是正確的動態路徑格式。另外注意,在右方括弧後面有一個點,是你所期待的標準路徑。

還不錯吧!對這類事情例子總是有用。還是讓我們來看更多的內容吧。我們有一個輸入框(變數輸入),你想讓movie clip的實體名稱出現在此框內。

_root[input]._visible = false;

對於開始階段,這個例子可能簡單了些。這段代碼是盡量簡單地告訴Flash來計算變數input,然後用此來建立對象的路徑。當然,這兒有些難(但很有用)。現在你有一大批movie clip實體名稱,並且你想給每個_x設定一個隨機數。

_root.nameArray = [ Joe , Jenny , Jesse , Jumping-Jude ];for (var j=0;j<_root.nameArray.length;j++) {    _root[_root.nameArray[j]]._x = random(200);}

很明顯這裡有些難度,但這是個速成班,所以你不得不學得快些!再注意這個明確的字串_root.nameArry好像並不必要。你可以簡單的用nameArry,但我還是願意保留我明確的路徑以備以後調試。同樣要注意的是,你必須在動態路徑裡包括_root;在被指向時Flash至少需要時間軸的名稱。

數組標識與動態路徑用法有一些複雜。實踐是最好的學習方法,所以你可以給自己一些小課題來增加你的經驗!一旦你對此著迷,我們就繼續前進。

相對路徑

這個圖表是從我先前的路徑教程中借用的。在初級教程中,我們討論了路徑如何可以用樹狀結構關聯。樹的主幹就是movie clips(分支)所在的_root主時間軸,每個分支可以容納其他clip和對象(子分支),每個子分支可以包含變數(葉子)。假設我們現在要在clip2裡鍵入一些代碼來調用clip1裡的一個變數。用初級教程中所教授的方法,代碼就是這樣的:

_root.clip1.variableName = value;

好極了!但是如果這個SWF被載入其他SWF中呢?在被載入到一個movie clip中時(我們使用loadMovie(“file.swf”,”targetMC”),所有的路徑都會被改變!Clip1的路徑不再是_root.clip1而是_root.targetMC.clip1。的確我們可以仔細檢查並重新寫路徑,但這就意味著沒有被載入其他SWF中時,我們的代碼就無法運行。我們想要的是那種不受外部環境影響,獨立執行的代碼。

相對路徑可以幫我們完成心愿。假設我們在樓梯上。我說“向上三級”,你照做。我說“走到第二級台階”。你會先返回到底樓,然後從底層開始往上走嗎?不,你很懶,只會向下移一級台階。這就是我們想讓Flash做的事情。我們不想讓它走到路徑的底層,因為情況隨時在變,我們只希望它知道與它相關的事情。Flash有一些代碼結構允許我們訪問與目前時間軸相關的變數時間軸。最重要的兩個是this 與 _parent。

this 是指向當前活動的對象或時間軸的。比如,如果我開啟一個新的Flash檔案,並在主時間軸的第一幀上加上下面的代碼:

this.variable = value;

Flash會建立出一個新的_root層級的變數,並賦予值。如果我在一個Movie clip裡鍵入同樣的代碼,該變數就會被建立在movie clip的時間軸上。“那又怎麼樣?”你說,“你只需變數名而可以省略this”。並不完全正確。你可以省略this,但Flash需要它。ActionScript是個非常友好的語言,它允許你懶惰,或者一定程度上犯點小錯。如果你省略this命令,Flash的ActionScript編譯器會在編譯時間自動加上,以使代碼適合Flash播放器閱讀。此外,this有更高價值的應用,尤其對進階程式員。它允許你建立你自己的函數原型,並在對象之上運行函數。在with 或 tellTarget命令裡面它也非常有用。這時候,你只需記得它是指向當前活動的時間軸或對象的就行了。

現在該講_parent了。

剛開始,_parent的用途可能更明顯。再看一下左邊圖表,回憶下類似的台階。我們知道台階2是台階3住前一級的台階。所以clip 1對clip 2來說,就是往上一級;就是說clip 2是在clip 1的時間軸上。因此Clip 1稱為clip 2的parent (父)。於是,當我們想從clip 2裡指向clip 1時,我們不需要給出從_root開始的全部路徑,而只需用相對路徑:

_parent.variable = value;

明白了嗎?主時間軸(_root)是clip 1的parent。所以如果我們在clip 1裡面,並想指向主時間軸上的某些元素時,我們就可以用:

_parent.variable = value;

當然,在這個例子裡我們沒有為了節省字母寫成_root.variable,而是用_parent.variable。再回憶一下loadMovie例子,如果我們使用_root表示將此SWF載入一個movie clip裡,這樣的標記法看起來好像被載入的SWF是在_root上面。使用_parent文法,我們就可以確保它看上去是在其parent時間軸上的變數。

_parent參數是可以疊加的。所以當我們在clip 2上,希望跳兩級到主時間軸上時,我們可以使用:

_parent._parent.variable = value;

第一個_parent使我們從clip 2跳到clip 1裡面,第二個使我們從clip 1跳到主時間軸上(再說一次,在這個例子裡可以是_root,但在loadMovie例子裡可能會完全不一樣)。

的確如此。孩子們,要想成為高手,實踐是最好的方法!



相關文章

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 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。