blog.Ring.idv.tw

ActionScript

「Layer」、「Level」和「Depth」之間的三角關係(三)

前面我們已經探討過「Layer」及「Depth」兩者之間的關係,也知道每個「MovieClip」都擁有自己的「Depth」,然而到目前為止我們仍未探討到「Level」,或許我們並不常使用到它,也可能永遠都不會用到它,但唯獨了解這三者之間的關係才有辦法打通任督二脈,所以本文將試著剖析這個鮮為人知的「Level」。

Flash Player擁有「Level Stacking Order」

根據[1]官方文件的說明,我們可以得知「Level」是一種屬於「Stack」的資料結構,也就是俗稱的「堆疊」,君不見Java Virtual Machine 或 Flash Player 都是以「堆疊」為基礎的虛擬機器,而在這裡Flash Player也將「Level」以「堆疊」的方式來運作之,既然知道它是以「堆疊」的方式運作,那是否有其限制「Level」的級數呢?這裡筆者測試了一下,在「Flash CS3」的環境之下,「Level」的級數確實可達到「0~19310575612」,然而重點在於「Level」和「Depth」之間的關係到底為何?底下我們試著用例子及圖例來解釋之。

我們將「Layer」、「Level」和「Depth」之間的三角關係(一)所驗證的範例拿來修改一下,並額外製作一個獨立的「粉紅方形」的SWF檔(test.swf),以供驗證。

程式一

trace("a_mc:"+a_mc.getDepth());
trace("b_mc:"+b_mc.getDepth());
trace("c_mc:"+c_mc.getDepth());
trace(_root);
trace(a_mc);
trace(b_mc);
trace(c_mc);
loadMovieNum("test.swf",1);

結果:

圖一

從結果中我們看到被載入的「test.swf」覆蓋了底下三個方形,所以我們可以確定「Level」級數愈高就呈現在愈上層,就算底下其中一個方形的「Depth」給予最大值(2130690044),仍然是無法超越「Level 1」,其實原因很簡單,底下三個方形都處於「Level 0」的級數中,然而「Depth」就是「Depth」,它是隸屬於「MovieClip」之中的,而「Level」卻是隸屬於「Flash Player」中的堆疊結構,所以「Level 1」的方形必凌駕於「Level 0」之上。

程式二

trace("a_mc:"+a_mc.getDepth());
trace("b_mc:"+b_mc.getDepth());
trace("c_mc:"+c_mc.getDepth());
trace(_root);
trace(a_mc);
trace(b_mc);
trace(c_mc);
a_mc.swapDepths(2130690044);
trace("a_mc:"+a_mc.getDepth());
loadMovieNum("test.swf",1);

結果:

圖二

欲將外部的SWF載入至「Level 0」,請注意下列這段說明:

If you load a SWF file into level 0, every level in Flash Player is unloaded, and level 0 is replaced with the new file.
The SWF file in level 0 sets the frame rate, background color, and frame size for all other loaded SWF files.

參考資料:

[1]Flash 8 Documentation-loadMovieNum function

範例下載

本文若有任何謬誤,希望請不吝地賜教,若能指正不勝感激。

2007-06-05 00:04:33 | Add Comment

「Layer」、「Level」和「Depth」之間的三角關係(二)

每個「MovieClip」均擁有自己的「Depth」

「Layer」、「Level」和「Depth」之間的三角關係(一)的驗證,我們即可了解到「Layer」和「Depth」之間的關係,又如「ActionScript 2 this vs. ActionScript 3 this」更可得知其實整個Flash動畫就是一個MovieClip,既然我們已知此條件成立,故可推論每個「MovieClip」均擁有自己的「Depth」,我們根據「Layer」、「Level」和「Depth」之間的三角關係(一)的例子來加以修改一下:

我們在「a_mc」、「b_mc」和「c_mc」這三個MovieClip裡頭,分別加上「d_mc」、「e_mc」和「f_mc」三個不同顏色的方形,並加入些程式來驗證:

圖一

程式一

trace("a_mc:"+a_mc.getDepth());
trace("b_mc:"+b_mc.getDepth());
trace("c_mc:"+c_mc.getDepth());
trace("d_mc:"+a_mc.d_mc.getDepth());
trace("e_mc:"+b_mc.e_mc.getDepth());
trace("f_mc:"+c_mc.f_mc.getDepth());

結果:

a_mc:-16383
b_mc:-16380
c_mc:-16377
d_mc:-16382
e_mc:-16382
f_mc:-16382

從結果來看,的確證明了每個MovieClip均擁有自己的「z-order stack」,意指為「Depth」,所以從上述的例子便可發現,「a_mc」、「b_mc」和「c_mc」各自擁有的「方形」所處於的「Depth」均出現在「-16382」位置上。

範例下載

2007-06-03 22:37:27 | Add Comment

「Layer」、「Level」和「Depth」之間的三角關係(一)

「Layer」、「Level」和「Depth」之間的三角關係,是往往造成初學者疑惑的地方~本文將透過一連串的實例來探討這三者之間的關係,來奠定往後學習各種MovieClip相關操作的程式基礎。

「Layers」將被轉化為「Depths」

「Layer」意指為我們在圖形化介面製作相關的Flash動畫時,所呈現給設計者視覺化的「圖層」順序(如圖一),有「Layer 1」、「Layer 2」、「Layer 3」和「Layer 4」,我們依序給予「黑色方形(a_mc)」、「紅色方形(b_mc)」、「橙色方形(c_mc)」的三個MovieClip,並在「Layer 4」下一些程式以供驗證:

圖一

程式一

trace("a_mc:"+a_mc.getDepth());
trace("b_mc:"+b_mc.getDepth());
trace("c_mc:"+c_mc.getDepth());
trace(_root);
trace(a_mc);
trace(b_mc);
trace(c_mc);

結果:

a_mc:-16383
b_mc:-16381
c_mc:-16379
_level0
_level0.a_mc
_level0.b_mc
_level0.c_mc

從結果中,我們可以清楚地知道各個MovieClip所處在的「Depth」,根據[1]官方文件得知「Depth」的範圍是從-16384~1048575,而[2]卻指出範圍可達-16384~2130690045,然而根據筆者測試的結果,其「Depth」範圍在「-16384~2130690044」均可指定,差別只在於負數「Depth」的MovieClip欲移除時必須做額外的處理,可參考「unloadMovie()」vs.「removeMovieClip()」差異(一)這篇的說明,所以從上述的結果來看,各個方形的MovieClip均取決於系統所指定的「Depth」,然而這些取決於系統所指定的「Depth」,必然不能違背我們在設計上的「Layer」順序,所以我們可得到一個結論,設計者在製作時期所排定的「Layers」順序將被轉化成「Depths」,另外值得一提的是,這些各個MovieClip都處於「Level 0」的位置。

倘若我們在同一圖層放置多個MovieClip,然後再個別觀察其「Depth」,其實終究的結果仍然會印證上述的結論,您可以自己試著動手嘗試看看~

參考資料:

[1]Managing movie clip depths

[2]http://jerryzz.7blog.net/user1/4868/archives/2005/198327.shtml

範例下載

2007-06-03 00:07:04 | Add Comment

「unloadMovie()」vs.「removeMovieClip()」差異(二)

其實根據ActionScript 2.0 Language Reference的說明,我們就可以了解「MovieClip.unloadMovie()」和「MovieClip.removeMovieClip()」的主要差異,相關說明如下:

「MovieClip.unloadMovie()」= Removes the contents of a movie clip instance.

「MovieClip.removeMovieClip()」= Removes a movie clip instance.

也就是說,「MovieClip.unloadMovie()」是移除此MovieClip實體內的任何內容(不包含Properties和Clip Handlers),而「MovieClip.removeMovieClip()」則是一併將此MovieClip實體移除,所以「MovieClip.unloadMovie()」比較像是做「清除」的動作。

「MovieClip.unloadMovie()」清除 vs.「MovieClip.removeMovieClip()」移除

我們一樣在Stage上用「Rectangle Tool」建立一個正方形的MovieClip,並將「Frame Rate」先設為「1」,如此較方便做測試,最後為它加上程式一~

程式一

onClipEvent(load)
{
	k = 20;
}
onClipEvent(enterFrame)
{
	trace("[_x]="+_x);
	trace("[k]="+k);
}
on(release)
{
	trace("Removed!");
	this.unloadMovie();
}

接著發佈執行並點擊它之後~

[_x]=10
[k]=20
[_x]=10
[k]=20
Removed!
[_x]=10
[k]=undefined

由此即可證明呼叫「MovieClip.unloadMovie()」並不會移除此實體的Properties和Clip Handlers,因為「onClipEvent(enterFrame)」仍然還在執行。

若是我們將程式改為程式二~

程式二

onClipEvent(load)
{
	k = 20;
}
onClipEvent(enterFrame)
{
	trace("[_x]="+_x);
	trace("[k]="+k);
}
on(release)
{
	trace("Removed!");
	this.swapDepths(0);
	this.removeMovieClip();
}

接著發佈執行並點擊它之後~

[_x]=10
[k]=20
[_x]=10
[k]=20
Removed!

也證明呼叫「MovieClip.removeMovieClip()」的確會將此MovieClip「移除」。

然而這樣的差異有何特別呢?

您可以試試呼叫「MovieClip.unloadMovie()」將此MovieClip先行清除,然後再更改此實體的Properties(e.g. _x、_y)~最後再藉由著此實體呼叫「MovieClip.loadMovie()」來載入另一個外部的SWF,便會將目前此實體的Properties再度應用在新載入的SWF。

範例下載

2007-05-29 18:13:32 | Add Comment

「unloadMovie()」vs.「removeMovieClip()」差異(一)

在Flash開發之中,如果我們要移除一個MovieClip其實可以呼叫「MovieClip.unloadMovie()」或「MovieClip.removeMovieClip()」,雖然這兩個Method用起來感覺似乎差異不大,但其實骨子裡可是有相當多的細節要注意的~

呼叫「MovieClip.removeMovieClip()」之前,請先改變「depth」

假設我們在Stage上用「Rectangle Tool」建立一個正方形的MovieClip,然後試著呼叫程式一程式二來移除~

程式一

on(release)
{
	this.unloadMovie();
}

程式二

on(release)
{
	this.removeMovieClip();
}

我們可以發現程式二居然無法移除MovieClip,這是因為呼叫「MovieClip.removeMovieClip()」的時候,這個MovieClip的「depth」必須要為「正數」才能移除,換句話說~我們必須先呼叫「MovieClip.swapDepths()」Method,將「depth」的值改為「正數」然後再呼叫「MovieClip.removeMovieClip()」即可,如程式三

程式三

on(release)
{
	this.swapDepths(0);
	this.removeMovieClip();
}

所以若是透過「MovieClip.createEmptyMovieClip()」Method來建立MovieClip的話,就注意第二個參數「depth」值,即可避免這樣的問題,例如:採用「getNextHighestDepth()」來決定「depth」值,因為此Method所傳回的值必為0或更大的值。

P.S. 「MovieClip.unloadMovie()」較適合用「清除」來解釋之

範例下載

2007-05-29 16:04:19 | Comments (2)

Next Posts~:::~Previous Posts
Copyright (C) Ching-Shen Chen. All rights reserved.

::: 搜尋 :::

::: 分類 :::

::: Ads :::

::: 最新文章 :::

::: 最新回應 :::

::: 訂閱 :::

Atom feed
Atom Comment