7.在不同的時間軸上訪問變量
盡管在一個時間軸上的變量不能被其他時間軸上的腳本直接訪問,但是它們可以被間接地訪問。為了在不同的時間軸上創(chuàng)建變量、取回變量值、或為變量賦值,我們可以使用“點語句”(EMCA-262標(biāo)準(zhǔn)中的官方術(shù)語為:dot syntax)。點語句在面向?qū)ο蟮木幊陶Z言(如Java,C++,和JavaScript)中是一個很普通的標(biāo)準(zhǔn)符號。為了在不同的時間軸上定位某個變量,我們使用下述點語句的措辭通式: movieClipInstanceName.variablName
該通式描述了如何指向另一個時間軸上的某個變量:首先是該變量所在的電影剪輯的名字,隨后是點操作符,最后是該變量的變量名。舉例說明,在前面的設(shè)想中,為了在主時間軸上引用square電影剪輯中的變量x,我們可以這樣: square.x
同樣,在主時間軸中,我們可以這樣引用circle電影剪輯中的變量y: circle.y
有了上述這些引用,我們可以在主時間軸上為square電影剪輯中的變量賦值以及取回它的值,象這樣: square.z = 5; // assign 5 to z in square var mainZ; // create mainZ on the main timeline mainZ = square.z; // assign mainZ the value of z in square
你一定注意到了我頻繁地使用限定詞“主時間軸”。這是因為如果只是使用clip.variable這樣的語法,那么我們就不能在circle電影剪輯中引用square電影剪輯中的變量。假設(shè)我們在circle電影剪輯的某個幀上的腳本代碼中放置一個square.x這樣的引用,解釋器將試圖在circle電影剪輯的內(nèi)部尋找一個名為square的電影剪輯,但是,我們的square卻位于主時間軸上。所以,為了從circle電影剪輯指向包含square電影剪輯的時間軸(在本例中是主時間軸),我們需要一種機制,而該機制帶來了兩個特殊屬性形式:_root和_parent。
6.1_root和_parent屬性 _root屬性是對電影主時間軸的直接引用。從某個電影剪輯結(jié)構(gòu)的任何嵌套深度中我們都能使用_root來定位主電影時間軸上的變量,象這樣: _root.mainZ // access the variable mainZ on the main timeline _root.firstName // access the variable firstName on the main timeline
我們甚至能夠?qū)⒛硞引用結(jié)合到_root上并借此形成對電影剪輯實例的引用,從而潛入電影的嵌套結(jié)構(gòu)中。例如,變量x在電影剪輯square的內(nèi)部,而square位于主電影時間軸上,我們可以這樣定位x: _root.square.x
上述引用在電影中的任何位置上都可以工作 —— 無論電影剪輯的嵌套結(jié)構(gòu)有多深 —— 因為該引用開始于我們的主電影時間軸:_root。下面是另一個嵌套的例子,演示如何訪問變量area,area在實例triangle中,而triangle位于實例shapes的時間軸上,shapes則位于主電影時間軸上: _root.shapes.triangle.area
任何由關(guān)鍵字_root開始的引用都稱為絕對引用,因為它們通過電影中固定且永恒不變的“主時間軸”來描述變量的位置。
有時候,我們想引用其他時間軸上的變量但是又不想通過主時間軸來引用(_root)。為此,我們使用_parent屬性,該屬性引用當(dāng)前電影剪輯實例所在的時間軸。舉例說明,若某段代碼附著于電影剪輯square的某一幀上,在該代碼段中,我們只要使用下述語法就可以引用square所在的時間軸上的變量: _parent.myVariable
由關(guān)鍵字_parent開始的引用被稱為相對引用(或關(guān)系引用),相對引用完全與它們所在的電影剪輯的位置有關(guān)。
回到以前的例子中,假設(shè)我們有一個變量size,該變量被定義在電影的主時間軸上。我們將一個名為shapes的電影剪輯實例放置在主電影時間軸上,并且我們在shapes的時間軸上定義變量color。還是在shapes的時間軸上,我們放置一個名為triangle的電影剪輯實例。該電影的層次結(jié)構(gòu)如下: img:\010205vs1
我們想要顯示變量color(在shapes中)的值,但是要求代碼附著在triangle的時間軸上。如何解決?方法一,我們可以使用一個絕對引用,如下: trace (_root.shape.color);
但是,這會使我們的代碼依托于主電影時間軸。方法二,為使我們的代碼更具靈活性,我們可以使用_parent屬性創(chuàng)建一個相對引用,如下: trace (_parent.color);
方法一(使用_root)的工作原理是從頂向下的思維模式;它始于主時間軸并向下穿越電影剪輯層次直到觸及變量color。方法二(使用_parent)的工作原理是從底向上的思維模式;它始于包含trace ()語句的電影剪輯(triangle),然后在電影剪輯層次中向上攀升一層并找到變量color。
我們可以在同一行中使用兩次_parent,以在電影剪輯層次中向上攀升兩層并訪問到主時間軸上的變量size。下面,我們將一些代碼附著在triangle上以引用主電影時間軸上的size: trace (_parent._parent.size);
連續(xù)兩次使用_parent使我們向上提升了兩層,在本例中,也就是說,將我們帶到了電影的主時間軸上。
變量定位使用哪種方法取決于當(dāng)你在不同的時間軸上放置電影剪輯符號的實例時你希望發(fā)生什么。在triangle例子中,如果我們在shapes電影剪輯中定義color的時侯希望對color的引用永遠指向color,那么我們就應(yīng)該使用_root語法,該語法為我們提供了對shapes中的color的一個固定的引用。但是,如果我們希望對color的引用指向某個變換了位置的color變量 —— 依賴于在哪個時間軸上有給定的triangle實例 —— 那么我們則應(yīng)該使用_parent語法。這幾句話好像不太容易理解,我希望你在繼續(xù)之前,能夠搞懂它們。為了幫助理解,我再提出一個設(shè)想:和上面的例子一樣,假設(shè)我們在shapes中放置color變量,而shapes放在電影的主時間軸上,并且我們希望對該color變量的引用永遠不要改變,那么對color使用絕對引用是合適的;變化一下,如果我們在電影的主時間軸上放置一個新的電影剪輯實例world,然后將shapes放置在world中以替代放置在主時間軸上,此時,上面的絕對引用出現(xiàn)了斷點,因為shapes不再是主電影時間軸上的實例了,而是位于主電影時間軸上的world實例中。你看,_parent屬性的優(yōu)點現(xiàn)在體現(xiàn)出來了,盡管color變量相對于主時間軸的位置發(fā)生了變化(以前是:主時間軸 → shapes實例 → color變量;而現(xiàn)在是:主時間軸 → world實例 → shapes實例 → color變量。),但是使用_parent屬性的相對引用卻仍能指向它(_parent.color),這是因為color變量相對于triangle實例所在的時間軸的位置并未改變(以前是:color變量和triangle電影剪輯實例同處于shapes的時間軸上;而現(xiàn)在是:廢話,還是同在shapes的時間軸上)。
6.2訪問不同文檔層上的變量 _root屬性指向當(dāng)前層(此層并非時間軸窗口上的層,而是指當(dāng)前的電影文檔在Flash播放器中的位置)的主電影時間軸。但是在Flash播放器的文檔堆棧中能夠容納多個電影文檔。順便說一下,堆棧是計算機原理中的概念,涉及存儲器和寄存器,有關(guān)堆棧的知識你可以在匯編語言中詳細了解。載入播放器文檔堆棧中的任何電影的主時間軸都被_leveln注明,n是該電影所在層的數(shù)字編號。層編號開始于0,象這樣:_level0,_level1,_level2,_level3,等等。有關(guān)加載多個電影的知識我們在以后的章節(jié)中討論。下面是一些展現(xiàn)多層變量定位的例子: _level1.firstName // firstName on level1
6.3變量訪問語句 點語句對于引用變量和時間軸來說是非常便捷的方式。這里是一些變量定位的語句: _root 指向電影的主時間軸 _root.x 指向電影的主時間軸上的變量,x _root.clip1.x 指向電影的主時間軸上的實例clip1中的變量,x _root.clip1.clip2.x 指向電影的主時間軸上的實例clip1中的實例clip2中的變量,x 真累 :( _parent 指向當(dāng)前電影剪輯所在的時間軸(當(dāng)前電影剪輯的時間軸的上一層)[注釋 1] _parent.x 指向當(dāng)前電影剪輯所在的時間軸上的變量,x(當(dāng)前電影剪輯的時間軸的上一層) _parent._parent.x 指向包含當(dāng)前電影剪輯的電影剪輯所在的時間軸上的變量,x(當(dāng)前電影剪輯的時間軸的上兩層) clip1.x 指向?qū)嵗齝lip1中的變量,x(clip1位于當(dāng)前的時間軸上) clip1.clip2.x 指向?qū)嵗齝lip2中的變量,x(clip2位于clip1的時間軸上,clip1在當(dāng)前的時間軸上。) _level1.x 指向加載到電影文檔層1中的電影的主時間軸上的變量,x _level2.x 指向加載到電影文檔層2中的電影的主時間軸上的變量,x [注釋 1]當(dāng)前電影剪輯所在的時間軸和當(dāng)前電影剪輯的時間軸是兩個完全不同的概念。請仔細體會。
出處:藍色理想
責(zé)任編輯:無意
上一頁 變量(6)- 變量的作用域 下一頁 變量(8)- 電影剪輯變量的生存期
◎進入論壇Flash專欄版塊參加討論
|