blog.Ring.idv.tw

Flash

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

事件處理-「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

什麼是RIA?

RIA(Rich Internet Application)近來隨著Silverlight、JavaFX和Apollo大肆地想爭奪這一塊大餅,那什麼是RIA呢?

根據Wiki - Rich Internet application的說明,RIA這個名詞是在2002年三月首先由Macromedia的一份白皮書「Macromedia Flash MX—A next-generation rich client」所提出來的,裡頭說明了RIA將俱備以下特點:

1.Provide an efficient, high-performance runtime for executing code, content and communications

2.Integrate content, communications and application interfaces into a common environment

3.Provide a powerful and extensible object model for interactivity

4.Enable rapid application development through components and re-use

5.Enable the use of web services and data services provided by application servers

6.Embrace connected and disconnected clients

7.Enable easy deployment on multiple platforms and devices

這句話「Rich Internet applications (RIA) are Web applications that have the features and functionality of traditional desktop applications.」其實就簡單扼要地解釋了RIA~

2007-05-23 13:18:52 | Add Comment

事件處理-「onClipEvent」vs.「MovieClip.onXXX」變數範圍

「onClipEvent」and「MovieClip.onXXX」變數範圍

我們建立一個MovieClip在Stage上,並將它命名為「a_mc」,並在此MovieClip上加些程式以便驗證。

onClipEvent(load)
{
	var bar = 10;
}

在MainTimeline[1]寫入下述程式:

a_mc.onLoad = function()
{
	var foo = 20;
}

在MainTimeline[2]寫入下述程式:

trace("a_mc(bar):"+a_mc.bar);
trace("a_mc(foo):"+a_mc.foo);
stop();

結果:

a_mc(bar):10
a_mc(foo):undefined

結果卻不如預期(bar=10,foo=20),這是因為任何宣告在「function」中的變數都將被視為「區域變數(local variables)」,而由於「onClipEvent」或「on」事件都必須附著在實體的「MovieClip」之上,所以無論哪一種事件,只要宣告在「MovieClip」的變數都將為「實體變數(instance variables)」

值得一提的是「MovieClip.onXXX」的作法,其實就像是C語言中的「函式指標(function pointer)」,可以用來指向一個「function」,這也是寫Linux Kernel的相關程式時,所必要的技能。

範例下載

2007-05-22 18:23:18 | Add Comment

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

::: 搜尋 :::

::: 分類 :::

::: 最新文章 :::

::: 最新回應 :::

::: 訂閱 :::

Atom feed
Atom Comment