blog.Ring.idv.tw

2007 May

「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)

Airchive.CodeApollo - Apollo 應用集中營

airchive.codeapollo.com這是一個以Apollo應用程式為主的「歸檔」平臺,明確的說就是整合搜尋、上傳和排名的檔案管理平臺,你可以將你的Apollo應用程式上傳到這個平臺和他人分享~

比較有趣的是,請注意到他Domain Name的第一個單字「Airchive」,其實字典是沒有這個單字的~我猜這個單字是將Apollo的副檔名「.air」和「archive」組合在一起,而造就成「Airchive」,其實還蠻有創意的~

BTW, 如果有人知道Apollo的副檔名「.air」是哪三個單字的縮寫或是其它的意思~麻煩不吝地分享,謝謝!~ (★最好有官方文件的佐證)

2007-05-27 10:33:06 | Add Comment

事件處理-「MovieClip」、「Button」對於「on」事件處理的變數範圍

「MovieClip」、「Button」對於「on」事件處理的變數範圍

我們建立一個MovieClip及一個Button在Stage上,並將MovieClip命名為「a_mc」,然後在MovieClipButton上各別加些程式以便驗證。

MovieClip

on(release)
{
	bar = 10;
	trace(this);
}

Button

on(release)
{
	foo = 5;
	trace(this);
}

最後再額外多建立一個Button,用來驗證變數的範圍~

測試用的Button

on(release)
{
	trace(foo);
	trace(a_mc.bar);
}

接著依序點擊「MovieClip」、「Button」以及「測試用的Button」,結果如下:

_level0.a_mc
_level0
5
10

從結果我們就可以了解,寫在「MovieClip」和「Button」的變數範圍是不一樣的,寫在「MovieClip」的變數範圍就如同「事件處理-「onClipEvent」vs.「MovieClip.onXXX」變數範圍」這篇所說明的,相對來說「Button」的情況較為特殊,也就是說寫在「Button」上的變數範圍,其實就是隸屬於「_root」的實體變數,更明確的說「_root」相等於MainTimeline的「this」,然而MainTimeline的「this」又是個「MovieClip」~

關於MainTimeline中的「this」,可以參考「ActionScript 2 this vs. ActionScript 3 this」這篇的說明~

範例下載

2007-05-25 18:18:21 | Add Comment

你長得像哪位名人呢?

剛剛在朋友的Blog中發現~ 有一個做Face Recognition的網站MyHeritage,可以提供將自己的照片上傳,然後此系統便會自動幫你分析,看看你長得像哪位名人哦~

現在才發現~我居然和「梁朝偉」先生是有所淵源地~ 呵~

2007-05-23 19:01:49 | Add Comment

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

::: 搜尋 :::

::: 分類 :::

::: 最新文章 :::

::: 最新回應 :::

::: 訂閱 :::

Atom feed
Atom Comment