blog.Ring.idv.tw

ActionScript

變數範圍-「loadVariables」vs.「loadVariablesNum」

想要從Flash載入外部資料,其實有許多樣的方式可以善加利用,譬如:「loadVariables」、「LoadVars」、「XML」等…

然而這些從外部載入進來的資料,必然有其自己所屬的變數範圍,所以本文將探討「loadVariables」vs.「loadVariablesNum」兩者的差異~

「loadVariables」vs.「loadVariablesNum」的差異

ActionScript 2.0 Language Reference的文件說明中,我們大概即可得知兩者間的不同,整理如下:

Global Function

loadVariables(url:String, target:Object, [method:String]) : Void

loadVariablesNum(url:String, level:Number, [method:String]) : Void

MovieClip Method

loadVariables(url:String, [method:String]) : Void

從上述我們可以知道「loadVariablesNum」是「Global Function」,而「loadVariables」則有「Global Function」和「MovieClip Method」兩種,接著我們再來推論載入的方式。

「_root == this」&「this == _level0」&「_level0 == _root」

請將下述程式寫在Frame[1]:

trace(_root == this);
trace(this == _level0);
trace(_level0 == _root);

結果為:

true
true
true

從結果即可證明「_level0」、「_root」和「this」三者之間都是指向同一個「MovieClip」,所以我們即可推論下述的載入方式都是相同的:

loadVariablesNum("test.txt",0);
loadVariables("test.txt",_level0); //Global Function
loadVariables("test.txt",this); //Global Function
loadVariables("test.txt",_root); //Global Function
_level0.loadVariables("test.txt"); //MovieClip Method
this.loadVariables("test.txt"); //MovieClip Method
_root.loadVariables("test.txt"); //MovieClip Method

為何需要「loadVariablesNum」

從上述的論點再來推測,我們是否可以直接執行「loadVariables("test.txt",_level1)」或「_level1.loadVariables("test.txt")」來取代「loadVariablesNum」呢?

答案是「否定的」~為何如此?我們來看下述這個範例:

trace(typeof(_level0));
trace(typeof(_level1));

結果:

movieclip
undefined

從上述的結果來看,「_level0」這個「MovieClip」早就存在於Flash Player裡頭了,然而「_level1」卻仍然尚未被定義的~

也就是說執行「loadVariables("test.txt",_level1)」或「_level1.loadVariables("test.txt")」,並不會為我們在「_level1」建立一個「MovieClip」,我們必須利用「loadVariablesNum("test.txt",1)」才行!!所以無論是「loadVariables」或「loadVariablesNum」,它們的變數範圍其實都隸屬於實體(時間軸)變數

最後只要了解「Layer」、「Level」和「Depth」之間的三角關係(四),以及本文所推論及驗證的一些觀念,相信你一定可以自由運用「loadVariables」和「loadVariablesNum」。

2007-06-23 17:28:52 | Add Comment

變數範圍-在「Function」上用「var」來宣告變數的差異(二)

「var」在Flash Player版本間的差異

我們在「變數範圍-在「Function」上用「var」來宣告變數的差異(一)」一文曾提及到「ActionDefineFunction」和「ActionDefineFunction2」兩者的區別,由於「ActionDefineFunction2」是在Flash Player 6 r65 版本之後才開始支援的指令(Instruction),所以這裡我們試著將先前的例子重新發佈為Flash Player 6,來觀察兩者之間的差異。

var:Frame 1

i = 10;
function test()
{
	var i = 20;
}
test();
trace(i);

結果:

10

倘若我們直接從bytecode上來看,當發佈成Flash Player 6版本之後的確產生了一些變化,我們可以看到上述是利用ActionCode「0x9B」(ActionDefineFunction)來定義「Function」,而非先前的「ActionDefineFunction2」(請參考:變數範圍-在「Function」上用「var」來宣告變數的差異(一)),而且最重要的是,上述所宣告「區域變數」的方式是利用ActionCode「0x3C」(ActionDefineLocal)來處理的,這也就是兩者之間最大的不同,所以我們即可得知無論發佈成Flash Player 6或7之後的版本,只要在「Function」內採用「var」宣告變數,Flash便會採用「ActionDefineLocal」或「ActionStoreRegister」來處理之

範例下載

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

2007-06-13 11:54:42 | Add Comment

變數範圍-在「Function」上用「var」來宣告變數的差異(一)

從「變數範圍-在「Frame」上用「var」來宣告變數的差異」一文中我們可以得知,在「Frame」上無論是否使用「var」來宣告變數,其實是沒有太大的差異的~但是在「Function」上卻俱備重要的意義。

在「Function」上用「var」來宣告變數的差異

我們依然製作兩個欲測試的flash(均發佈為Flash Player 9),並且在它們的「Frame 1」個別加上些程式以便驗證,如下述:

var:Frame 1

i = 10;
function test()
{
	var i = 20;
}
test();
trace(i);

結果:

10

non_var:Frame 1

i = 10;
function test()
{
	i = 20;
}
test();
trace(i);

結果:

20

從兩者的結果中,其實我們就可以發現在「Function」加上「var」宣告,才是明確的定義此變數為「區域變數」,否則便是「實體(時間軸)變數」,然而這從這兩者的bytecode上來看的話,前者是利用ActionCode「0x8E」(ActionDefineFunction2)的方式來定義,而後者則是利用ActionCode「0x9B」(ActionDefineFunction),這兩者最大的差別在於前者(ActionDefineFunction2)可以將「參數」或「區域變數」利用Flash Player內部的「Register」來取而代之,而且更擴增「Register」到「255」個,以便增強其執行速度~但這並不是重點所在,重點在於前者的「test()」function裡面是利用ActionCode「0x87」(ActionStoreRegister)來將「20」這個值儲存於「Register」之中,所以我們在「Function」之外並無法取得它,也就是所謂的「區域變數」,而後者則是利用ActionCode「0x1D」(ActionSetVariable)來將「20」這個值儲存於「_level0」這個MovieClip的「實體變數」之中,這便是兩者之間的差異所在。

範例下載

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

2007-06-13 01:45:30 | Comments (2)

變數範圍-在「Frame」上用「var」來宣告變數的差異

在「Frame」上用「var」來宣告變數的差異

基本上要宣告「區域變數」我們必須加上「var」來宣告之,為何筆者要加上「必須」來強調呢?這是因為加上「var」宣告在「Function」和宣告在「Frame」之間兩者將有所差異,所以我們不妨先看下述這兩個例子:

筆者製作兩個欲測試的flash,並且在它們的「Frame 1」個別加上些程式以便驗證,如下述:

var:Frame 1

var i = 10;
trace(i);

結果:

10

non_var:Frame 1

i = 10;
trace(i);

結果:

10

從上述的例子之中,我們可以發現其實兩者的結果是相同的,但是將它們的bytecode攤出來看之下,的確可以發現些端倪~

在「var i = 10;」宣告之下所採用的ActionCode為「0x3C」(ActionDefineLocal),相反的若直接採用「i = 10」來宣告的話,其所採用的ActionCode則為「0x1D」(ActionSetVariable),然而重點在於Flash雖然在兩者之間採用不同的ActionCode來處理,但是在取值的方式卻是利用相同的「0x1C」(ActionGetVariable)來取得變數值,所以我們可以就此推論:在「Frame」上無論是否使用「var」來宣告變數,其實是無傷大雅地!然而在「Function」卻並非如此~

By The Way, 在ActionScript 3.0之下採用「i = 10」的方式宣告變數是無法完成編譯的!

範例下載

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

2007-06-12 21:48:49 | Add Comment

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

經由「Layer」、「Level」和「Depth」之間的三角關係()的相關實例與驗證,我們整理出一些重點出來,進而釐清這三者之間所存在的微妙關係,如下述幾點:

「Layer」、「Level」和「Depth」重點概念

1.基本上在Author time所呈現的視覺化「Layers」都將被轉化為「Depths」。

2.每個「MovieClip」都擁有自己的「Depth」。

3.「Depth」範圍在「-16384~2130690044」均可指定。

4.「Level」是隸屬於「Flash Player」中的堆疊結構。

5.「Level」級數可達「0~19310575612」。

「A picture is worth a thousand words」

從上述的幾個重點,筆者繪製下圖以方便理解:

換句話說,如果我們在撰寫ActionScript的一些應用時,倘若沒有使用到任何與「Level」有關的function,例如:「loadMovieNum()」、「loadVariablesNum()」等等…,其實絕大部份我們只會在「_level0」活動活動筋骨而已,然而掌握住這些要點,卻是奠定往後釐清各個觀念的不二法門,例如:「變數範圍」…。

2007-06-10 01:43:10 | Add Comment

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

::: 搜尋 :::

::: 分類 :::

::: Ads :::

::: 最新文章 :::

::: 最新回應 :::

::: 訂閱 :::

Atom feed
Atom Comment