三、深度(Depth)
深度(Depth)僅僅需要一個(gè)數(shù)字描述,F(xiàn)lash Player 使
用這個(gè)數(shù)字來(lái)指定對(duì)象的層疊位置。所謂層疊是指一種顯示時(shí)的的遮蓋關(guān)系。深度值較大則顯示較前,深度值較小則顯示較后,較后的要被較前的遮蓋。深度具有可
比性但僅限于兄弟節(jié)點(diǎn),所以同一父節(jié)點(diǎn)下的兄弟具有不同的深度,同時(shí)這個(gè)深度也描述了他們之間的層疊關(guān)系。屬于不同父節(jié)點(diǎn)的子節(jié)點(diǎn)可以有相同的深度,但他
們不具有可比性。
編輯環(huán)境下,F(xiàn)lash使用了圖層(Layer) 來(lái)組織對(duì)象。這時(shí), Flash 并沒(méi)有給對(duì)象指定一個(gè)深度,只有當(dāng)Flash 文檔在運(yùn)行時(shí) Flash Player根據(jù)用戶(hù)最初在編輯環(huán)境下的拖放情況來(lái)指定對(duì)象的深度。這里的圖層可以認(rèn)為是同一父時(shí)間軸節(jié)點(diǎn)下子時(shí)間軸節(jié)點(diǎn)的集合。圖層和圖層之間不存在交集,而且圖層是一個(gè)動(dòng)態(tài)的集合,隨著程序的運(yùn)行,集合中的元素也會(huì)發(fā)生變化。Flash 也可以在運(yùn)行時(shí)動(dòng)態(tài)地創(chuàng)建時(shí)間軸,例如使用 attachMovie()、duplicateMovieClip()等語(yǔ)句,但必需以參數(shù)的形式給出要被創(chuàng)建的時(shí)間軸的深度。
對(duì)象在編輯環(huán)境下的拖放順序以及時(shí)間軸上圖層的層疊關(guān)系,用來(lái)幫助Flash 確定對(duì)象的深度。圖層在Actionscript中是不被引用的,所以在swf文件中也不會(huì)有圖層這個(gè)概念。在編譯時(shí),圖層被分解為多個(gè)對(duì)象(多個(gè)時(shí)間軸),并且每一個(gè)對(duì)象都會(huì)被指定一個(gè)深度。當(dāng)Flash 播放時(shí),時(shí)間軸會(huì)讀取圖層中的內(nèi)容,并根據(jù)和其他對(duì)象的相對(duì)位置關(guān)系指定它的深度。如果對(duì)象所在的圖層較高則獲得一個(gè)比較高的深度,如果對(duì)象所在的圖層較底則獲取一個(gè)較低的深度。與此同時(shí),F(xiàn)lash也會(huì)為對(duì)象指定一個(gè)名稱(chēng),實(shí)現(xiàn)腳本對(duì)該對(duì)象的引用。深度概念也影響Flash 中對(duì)象的創(chuàng)建,在FileàPublish SettingàLoad Order 中可以設(shè)置對(duì)象被創(chuàng)建的順序,指定是由低深度到高深度(Bottom up)地創(chuàng)建,還是由高深度到低深度(Top down)地創(chuàng)建,F(xiàn)lash中的默認(rèn)為前者。
Actionscript 還提供了一些與深度相關(guān)的方法和管理對(duì)象:
深度方法或深度管理對(duì)象
|
功能描述
|
返回值
|
MovieClip.attachMovie()
|
從庫(kù)中創(chuàng)建一個(gè)電影剪輯實(shí)例。
|
被創(chuàng)建的電影剪輯的引用
|
MovieClip.createEmptyMovieClip()
|
創(chuàng)建一個(gè)空的電影剪輯
|
被創(chuàng)建的電影剪輯的引用
|
MovieClip.createTextField()
|
創(chuàng)建一個(gè)文本框
|
無(wú)返回值
|
MovieClip.duplicateMovieClip()
|
創(chuàng)建一個(gè)電影剪輯的拷貝
|
被創(chuàng)建的電影剪輯的引用
|
MovieClip.getDepth()
|
返回電影剪輯的深度
|
深度數(shù)值
|
MovieClip.getInstanceAtDepth()
|
返回占據(jù)指定深度的電影剪輯
|
指定深度下電影剪輯的引用
|
MovieClip.getNextHighestDepth()
|
返回最高的可用深度
|
深度數(shù)值
|
MovieClip.removeMovieClip()
|
移除動(dòng)態(tài)創(chuàng)建的電影剪輯
|
無(wú)返回值
|
MovieClip.swapDepths()
|
交換兩個(gè)電影剪輯的深度
|
無(wú)返回值
|
DepthManager Component
|
深度管理器
|
|
深度方法和功能描述
這里需要加以說(shuō)明的是,SwapDepth()方
法可以把在不同深度的兩個(gè)對(duì)象進(jìn)行深度交換。如果要實(shí)現(xiàn)這種交換有兩種方法:一是把兩個(gè)對(duì)象進(jìn)行調(diào)換,即把上面的拿到下面,把下面的拿到上面,這是對(duì)對(duì)象
本身進(jìn)行操作;二是直接更改對(duì)象的深度屬性,即直接修改指定對(duì)象深度的數(shù)值。但是如果使用后者顯然不是在交換深度而是在設(shè)置深度了。SwapDepth()方法是實(shí)現(xiàn)對(duì)象深度位置的交換而非設(shè)置深度。可以把深度理解為一個(gè)容器,比如說(shuō)是房子,如果兩個(gè)人要交換房子,那么必須是你搬過(guò)來(lái)我搬過(guò)去,而僅僅更換門(mén)牌是沒(méi)有什么用處的。所以深度是只讀的。另外,getDepth()方法可以很方便的獲取MovieClip、Button和TextField對(duì)象的深度數(shù)據(jù)。
另外,深度管理器(DepthManager)是一個(gè)專(zhuān)門(mén)對(duì)深度進(jìn)行管理的Flash V2組件,它封裝了若干深度管理的方法:
DepthManager.createChildAtDepth():在指定深度處創(chuàng)建指定元件的子級(jí)。
DepthManager.createClassChildAtDepth():在該指定深度處創(chuàng)建指定類(lèi)的對(duì)象。
DepthManager.createClassObjectAtDepth():在指定深度處創(chuàng)建指定類(lèi)的實(shí)例。
DepthManager.createObjectAtDepth():在指定深度處創(chuàng)建一個(gè)對(duì)象。
DepthManager.setDepthAbove():移動(dòng)實(shí)例到指定實(shí)例的深度之上。
DepthManager.setDepthBelow():移動(dòng)實(shí)例到指定實(shí)例的深度之下。
DepthManager.setDepthTo():將實(shí)例移動(dòng)到指深度。
四、深度區(qū)域:
在為對(duì)象指定深度時(shí)必須清楚地了解Flash在深度上的三個(gè)區(qū)域。在Flash 中,深度的范圍在-16384到2130690045之間,任何Flash的可視對(duì)象都不會(huì)超出這個(gè)范圍。在播放時(shí),F(xiàn)lash把時(shí)間軸中的對(duì)象按照默認(rèn)的設(shè)置進(jìn)行加載。-16384到-1是深度的第一個(gè)范圍,在這個(gè)深度區(qū)域?qū)ο蟛豢梢允褂媚_本創(chuàng)建和移除,用于放置用戶(hù)在編輯環(huán)境下創(chuàng)建的對(duì)象,這里把它稱(chēng)為時(shí)間軸區(qū)(Timeline)。接下來(lái)是0到1048575的深度范圍,在這個(gè)深度范圍內(nèi),對(duì)象可以使用腳本創(chuàng)建和移除,所以稱(chēng)為動(dòng)態(tài)區(qū)(Dynamic)。之后一個(gè)區(qū)域稱(chēng)為保留區(qū)(Reserve),深度范圍在1048576和2130690045之間,可以放置MC但是不可以移除。
Flash的深度區(qū)域:
區(qū)域
|
深度范圍
|
特征
|
時(shí)間軸區(qū)
|
-16384 到 -1
|
主要用于放置Flash 編輯時(shí)的對(duì)象,且對(duì)象不可用腳本移除,但可以使用腳本創(chuàng)建。
|
動(dòng)態(tài)區(qū)
|
0到1048575
|
實(shí)現(xiàn)運(yùn)行時(shí)的動(dòng)態(tài)創(chuàng)建、動(dòng)態(tài)訪問(wèn)和動(dòng)態(tài)移除
|
保留區(qū)
|
1048576到2130690045
|
實(shí)現(xiàn)運(yùn)行時(shí)的動(dòng)態(tài)創(chuàng)建、動(dòng)態(tài)訪問(wèn),但不支持使用腳本移除對(duì)象。
|
Flash 在動(dòng)態(tài)區(qū)之前提供了時(shí)間軸區(qū),用于放置編輯環(huán)境下時(shí)間軸中的對(duì)象。在編輯環(huán)境下,最底層的對(duì)象放置到區(qū)域的最深處——-16384。在通常情況下會(huì)從-16383這個(gè)深度開(kāi)始,F(xiàn)lash依次向較高深度放置時(shí)間軸中的對(duì)象。
接下來(lái)是動(dòng)態(tài)區(qū),在這個(gè)區(qū)域可以放置那些可以動(dòng)態(tài)創(chuàng)建和移除的對(duì)象。而且這個(gè)區(qū)域也符合一般人的使用習(xí)慣,因?yàn)樗纳疃仁菑?開(kāi)始的,而開(kāi)發(fā)者在創(chuàng)建對(duì)象時(shí)通常也會(huì)考慮這個(gè)范圍。在這個(gè)范圍可以獲得比較大的自由權(quán),開(kāi)發(fā)者可以使用腳本動(dòng)態(tài)地創(chuàng)建和移除對(duì)象。如果對(duì)象不在動(dòng)態(tài)區(qū),那么首先可以把對(duì)象交換到動(dòng)態(tài)區(qū),然后再進(jìn)行移除。
保留區(qū)可以理解為動(dòng)態(tài)區(qū)的一個(gè)擴(kuò)展,只是在保留區(qū)中無(wú)法使用腳本移除對(duì)象,對(duì)象在那個(gè)區(qū)域可以動(dòng)態(tài)地被創(chuàng)建。在這個(gè)區(qū)域?qū)ο笠部梢允褂胹wapDepth()方法交換到其它的深度區(qū)域。但保留區(qū)還是一個(gè)比較特殊的區(qū)域,因?yàn)槟抢锏膶?duì)象不可以被移除,而且深度高的有點(diǎn)離譜。在保留區(qū)Flash為對(duì)象提供了一定的存儲(chǔ)空間。
需要特別注意的是,F(xiàn)lash 在使用createEmptyMovieClip()方法創(chuàng)建的空MC時(shí),深度的分配上幾乎沒(méi)有什么限制,深度可以指定在-999999999999以下或是999999999999以上。雖然這個(gè)深度已經(jīng)超出了剛才討論的那個(gè)范圍。
五、時(shí)間軸刷新:
關(guān)于深度,可能會(huì)遇到一些另人混淆的問(wèn)題,特別是動(dòng)態(tài)區(qū)和時(shí)間軸區(qū)。當(dāng)時(shí)間軸被刷新時(shí),所有的對(duì)象將被重新創(chuàng)建。Flash 會(huì)掃描位于該時(shí)間軸的時(shí)間軸區(qū)域,并清除保存在這些深度上的對(duì)象。然后Flash 讀取時(shí)間軸上的數(shù)據(jù)并重新創(chuàng)建這些對(duì)象,但是通過(guò)動(dòng)態(tài)方法創(chuàng)建的對(duì)象將被忽略。其中一個(gè)例子就是使用gotoAndPlay()返回播放已經(jīng)播放過(guò)的幀,例如從第10幀返回到底5幀播放,這時(shí)Flash為了重新展示第5幀的內(nèi)容必須刷新時(shí)間軸并完全重構(gòu)第5幀的內(nèi)容。但是使用動(dòng)態(tài)方法創(chuàng)建的對(duì)象如果在時(shí)間軸刷新時(shí)被移除,那么這時(shí)并不被自動(dòng)創(chuàng)建,除非程序給出。
很
明顯,這樣可能會(huì)引起一些問(wèn)題。首先,這樣會(huì)失去在時(shí)間軸區(qū)域或是使用動(dòng)態(tài)方法已經(jīng)創(chuàng)建并交換到時(shí)間軸區(qū)域的對(duì)象。也就是在這中情況,不可以把使用動(dòng)態(tài)方
法創(chuàng)建的對(duì)象交換到時(shí)間軸區(qū)域,否則在時(shí)間軸刷新時(shí)會(huì)丟失這些對(duì)象。在開(kāi)發(fā)時(shí)為避免這種情況的發(fā)生,可以創(chuàng)建一個(gè)單幀停止的MC,這樣的MC可以是安全的,可以不必為時(shí)間軸刷新而擔(dān)憂(yōu)。
另外一個(gè)問(wèn)題是無(wú)法移除所需要移除的對(duì)象。其原因是由于使用深度交換方法把時(shí)間軸區(qū)的對(duì)象轉(zhuǎn)移到了非時(shí)間軸區(qū),這樣在時(shí)間軸刷新時(shí)就無(wú)法清除該對(duì)象了,而且這次刷新還會(huì)創(chuàng)建一個(gè)新的該對(duì)象到時(shí)間軸區(qū)。這種情況也應(yīng)該避免發(fā)生。
還有一個(gè)需要清楚的問(wèn)題是場(chǎng)景(Scene)跳轉(zhuǎn)的問(wèn)題。場(chǎng)景間的跳轉(zhuǎn)不會(huì)引起時(shí)間軸的刷新,也不會(huì)觸發(fā)其他一些特殊的事件。作為場(chǎng)景本身而言,它們是主時(shí)間軸的片段,當(dāng)Flash被發(fā)布以后,這些場(chǎng)景便會(huì)整合到一起,變成單個(gè)的主時(shí)間軸。所以用戶(hù)在一個(gè)場(chǎng)景創(chuàng)建的對(duì)象,它仍舊可以在接下來(lái)的場(chǎng)景出現(xiàn),當(dāng)然也可以使用腳本使那些對(duì)象消失。
六、播放器執(zhí)行順序:
在
深度問(wèn)題上,還有一點(diǎn)比較容易被人們忽視。正如前面所提到的,深度也會(huì)影響到腳本的執(zhí)行順序。事實(shí)上深度本身并不影響腳本的執(zhí)行順序,但是深度卻與對(duì)象的
創(chuàng)建順序有關(guān)。一般我們都會(huì)認(rèn)為,在同一時(shí)間軸上,首先被創(chuàng)建的對(duì)象會(huì)首先執(zhí)行它所包含的腳本。另人感到奇怪的是,在默認(rèn)的發(fā)布設(shè)置下,那些最晚被創(chuàng)建的
對(duì)象反而首先執(zhí)行了EnterFrame事件中的腳本。在默認(rèn)情況下對(duì)象從最底層開(kāi)始被創(chuàng)建,這一點(diǎn)我們可以在Flash的發(fā)布選項(xiàng)中設(shè)置。幀腳本是按照它們被創(chuàng)建的順序執(zhí)行的。這樣如果在bottom up 模式下,從技術(shù)角度而言,較低層的腳本反而較早執(zhí)行,但是值得一提的是,EnterFrame事件中的腳本剛剛與之相反。
看來(lái)很有必要追究一下EnterFrame事件到底是怎樣的一個(gè)事件。EnterFrame事件隨著電影剪輯的幀速被持續(xù)地觸發(fā)??梢哉J(rèn)為EnterFrame事件是在播放頭進(jìn)入某一幀時(shí)觸發(fā)的一個(gè)事件,但是在EnterFrame事件中的代碼將先與幀腳本執(zhí)行。但是,對(duì)象的創(chuàng)建和Flash的播放(對(duì)象狀態(tài)的改變過(guò)程)到底是怎樣一個(gè)關(guān)系呢?在Flash中第一幀的幀腳本和其它幀的幀腳本有著不同的行為。當(dāng)運(yùn)行一個(gè)Swf文
件時(shí),它的第一幀將首先被創(chuàng)建,然后開(kāi)始載入該文檔中的對(duì)象并拖入到舞臺(tái),這個(gè)過(guò)程可以認(rèn)為是一個(gè)初始化的過(guò)程。所以在這個(gè)過(guò)程中隨著對(duì)象的載入第一幀的
容量將不斷增大。這樣做的原因也是顯而易見(jiàn)的,只有當(dāng)對(duì)象全部載入后,腳本才能執(zhí)行,設(shè)想如果腳本所要操作的對(duì)象都不存在,那么腳本必然會(huì)發(fā)生錯(cuò)誤。一旦
所有的對(duì)象載入完畢,除第一幀外的其它幀都將被一次性創(chuàng)建,并開(kāi)始播放。這樣做的另外一個(gè)原因是,如果按照先創(chuàng)建,先播放的原則,那么必然導(dǎo)致不同電影剪
輯播放時(shí)步調(diào)的不一致。因?yàn)閯?chuàng)建對(duì)象是需要時(shí)間的,特別是在網(wǎng)絡(luò)上,它還要有一個(gè)下載的過(guò)程。這里還要注意的是#initclip和#endinitclip中的代碼塊,它們通常定義在電影剪輯的第一幀,只要符號(hào)被定義且被編譯(電影剪輯符號(hào)定義了,但不一定都被編譯),那么就執(zhí)行該代碼段,它用于電影剪輯的初始化,所以?xún)?yōu)先于其它腳本執(zhí)行,并且僅執(zhí)行一次,它的運(yùn)行效果將作用到該剪輯的所有實(shí)例。
這樣,就可以得出,F(xiàn)lash的執(zhí)行可以分成兩個(gè)過(guò)程。首先是對(duì)象的下載、創(chuàng)建和初始化,接下來(lái)是一個(gè)播放的過(guò)程。播放是一個(gè)對(duì)象狀態(tài)隨著幀速改變的過(guò)程,其狀態(tài)的兩個(gè)極端是存在與不存在。這樣在Flash的執(zhí)行過(guò)程中,電影剪輯第一幀的腳本將首先被執(zhí)行;然后是播放過(guò)程,其腳本執(zhí)行的原則是EnterFrane事件腳本的執(zhí)行先于幀腳本的執(zhí)行。
七、圖層(Layer)、層級(jí)(level)和深度(depth)
通常人們會(huì)把圖層和層級(jí)混淆起來(lái)使用,但事實(shí)上它們是兩個(gè)完全不同的概念。時(shí)間軸可以以?xún)煞N方式獨(dú)立于主時(shí)間軸:電影剪輯(Movie Clip)和層級(jí)(Level)。這里所謂的獨(dú)立是指獨(dú)立的播放與停止。圖層(Layer),只在編輯環(huán)境下被看到,用于存放和組織在時(shí)間軸上的對(duì)象。它們僅僅只是在編輯環(huán)境下出現(xiàn),當(dāng)發(fā)布一個(gè)Flash文件時(shí),這些圖層將被壓縮到同一個(gè)時(shí)間軸上。
層級(jí)(Level)位于一個(gè)獨(dú)立的時(shí)間軸上,用于存儲(chǔ)使用loadmovie方法加載的外部Swf文件。層級(jí)(Level)可以使用_level0, _level1, _level3, _leveln 對(duì)其進(jìn)行引用。層級(jí)越高,就越接近觀察者,也就越容易被看到,這一點(diǎn)與深度是一致的。使用該方法加載的電影將貫穿電影的主時(shí)間軸。由于這個(gè)原因從外部加載電影的目的常常是為了加載某些聲音,因?yàn)槁曇舨粫?huì)影響到原來(lái)電影的播放。
電影剪輯(Movie Clip)同樣是一個(gè)獨(dú)立的時(shí)間軸,但是電影剪輯位于庫(kù)(Library)中,并不是位于電影的外部。所以它與層級(jí)不同,如果需要的話,你可以在幀上創(chuàng)建一個(gè)電影剪輯的實(shí)例。 從庫(kù)中拖動(dòng)一個(gè)電影剪輯到舞臺(tái)(Stage),那么就創(chuàng)建了該電影剪輯的一個(gè)實(shí)例,可以指定一個(gè)唯一的名稱(chēng)對(duì)其進(jìn)行引用。電影剪輯可以包含其它的電影剪輯,這就是通常所說(shuō)的嵌套(nesting)。
深度(Depth)通常會(huì)用于swapDepth()和attachMovie()這些方法,用于指定電影剪輯的層疊順序。它可以被認(rèn)為可視對(duì)象在時(shí)間軸上的層疊順序(Z-Order)。
這里還要指出的是 _root 和 _level0 的區(qū)別。_root 和_level0引用的并非同一個(gè)對(duì)象,它們是有差別的。_root 指代電影的主時(shí)間軸,如果一個(gè)電影有多個(gè)層級(jí)那么_root指代當(dāng)前腳本正在執(zhí)行的那個(gè)層級(jí)。例如:在層級(jí)n中的某個(gè)腳本包含了 _root,這時(shí)_root返回 _leveln,_root和_leveln才是等同的。
posted on 2008-06-16 15:41
七星重劍 閱讀(955)
評(píng)論(0) 編輯 收藏 引用 所屬分類(lèi):
Flash Scaleform GFx