blog.Ring.idv.tw

ActionScript

「Target Path」命中你的目標實體(三)

最後搞懂你的「_parent」目標位置

「parent」,字面上可以解讀為「父親/母親」的意思,所以顧名思義,「_parent」便是意指為你目前所處在於此實體的上一層實體(父親/母親),也就是說,我們可以利用「_parent」來控制上一層實體的種種行為,例如:改變它的「_x」和「_y」屬性值或呼叫它所提供的函數等。

這裡我們將「Target Path」命中你的目標實體(二)的範例加以修改一下,直接將「red」和「green」的Frame[1]改寫成:

trace(this._parent);

結果:

_level0
_level0.red

從結果中可以明確地知道,在「green」的上一層實體為「red」(_level0.red),而在「red」的上一層實體則為「_level0」,這也就是「_parent」的作用所在,或許讀者會覺得這樣一路下來感覺好像沒什麼多大的成就感,然而明確地了解這幾個屬性的用法並釐清觀念,才能為接下來要闡述的東西打好根基。

「Target Path」目標路徑的區隔「.」(dot)

通常我們要區分目錄夾的層級時,我們可以利用「\」符號來判別,例如:「C:\windows\temp」,倘若是要區分網址的層級時,我們便可利用「/」符號來加以判斷,例如:「http://blog.ring.idv.tw/temp/test.html」,然而在Flash要區分層層的元件結構,則必須採用「.」(dot)符號來加以區隔,例如:「_level0.red.green」。

範例下載

2007-07-02 21:05:20 | Add Comment

「Target Path」命中你的目標實體(二)

再搞懂你的「this」目標位置

「this」,字面上可以解讀為「這個」或是「這東西」的意思,所以顧名思義,「this」便是意指為你目前所處在於此實體的這東西,然而從「Target Path」命中你的目標實體(一)我們已知「_root」所指的就是處於「_level0」這個「MovieClip」,倘若我們在此「MovieClip」為它加上「this」,所以如果沒意外的話,那它應當也是代表著「_level0」囉?答案更是肯定!

trace(targetPath(this));
trace(this); //此作法較簡潔

結果:

_level0
_level0

結果如同我們所預期的顯示出「_level0」,或許上述的例子過於簡單,我們再來看一個稍為有點結構的例子:

範例:

我們先在Stage上放置一個紅色矩形的「MovieClip」,並在此「MovieClip」再放置一個綠色圓形的「MovieClip」,並給予兩者分別為「red」、「green」的實體名稱(instance name),結構如下圖所示:

並分別在這兩個「MovieClip」的Frame[1]寫下:

trace(this);

結果:

_level0.red
_level0.red.green

結果就像筆者先前所說的,基本上我們其實大多都在「_level0」活動活動筋骨而已,加上「_root」所指的就是「_level0」,所以這裡的「_level0」也代表著「根」的意思,也就是說,我們放置在Stage上的「red」和「green」這兩個「MovieClip」,它們的「根」也就是「_level0」,這從結果中可以清楚地知道,然而重點在於我們在這兩個「MovieClip」所寫的程式,它們分別呈現為「_level0.red」和「_level0.red.green」,不僅分別對應我們放置在Stage上的結構順序,也呼應「this」這個屬性的意義。

範例下載

2007-07-02 19:29:01 | Add Comment

「Target Path」命中你的目標實體(一)

在本文中,主要將說明「_root」、「_parent」和「this」這些用法及概念,讓你得以自由地操控「MovieClip」、「Button」等…,才不致於在層層的元件內繞來繞去,找不到該在何處下程式,或是寫在不該寫的地方。

先搞懂你的「_root」目標位置

「Layer」、「Level」和「Depth」之間的三角關係(四)一文中,筆者曾繪製一個Flash Player內部運作的Level、Depth示意圖,從圖中可以知道「Level」和「Depth」之間的關係,然而基本上我們其實大多都在「_level0」活動活動筋骨,難道「_root」和「_level0」有點關係?答案是肯定的!

我們來看一下這個簡單的程式:

trace(targetPath(_root));
trace(typeof(_root));

結果:

_level0
movieclip

「targetPath」這個函數可以用來回傳所指定實體的目標路徑,所以從上述的結果即可證明「_root」所指的就是「_level0」這個「MovieClip」,若從字面上來解讀它的話,那它就是代表著「根」的意思,所以既然它是一個「MovieClip」,我們當然可以放置層層的元件在其中囉!

2007-07-02 18:29:45 | Add Comment

變數範圍-一個獨立於Flash Player中的物件「_global」(全域變數)

根據「ActionScript 2.0 Language Reference」在「_global」的描述中,我們可以知道它是在「Flash Player 6」之後出來的產物,這裡我們就來談談「全域變數」~

一個獨立於Flash Player中的物件「_global」

通常設定一個「全域變數」的變數或是函數的話,基本上用法大致如下:

程式一

_global.foo = 10;
_global.func = function()
{
	trace(this.foo);
}
func();

結果:

10

在上述程式的「func」匿名函數中,我們使用「this」來代表我們將存取此「_global」自身的一些屬性,而從結果中我們的確將「foo」屬性利用「trace」函數將它的值顯示在「Output Panel」中,接著我們再來看另一個例子:

trace(typeof(_global));

結果:

object

在「Output Panel」你會發現結果顯示出「_global」居然是一個物件?的確!Flash Player所設計的「全域變數」的確就是仰賴「_global」物件來加以達成的!

倘若我們將程式一利用「偵錯模式(Ctrl+Shift+Enter)」來看的話,你會發現下圖的證據所在:

2007-06-30 22:23:53 | Add Comment

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

在「變數範圍-在「Function」上用「var」來宣告變數的差異(一)」一文中,我們曾提及在「Function」加上「var」宣告,才是明確的定義此變數為「區域變數」,否則便是「實體(時間軸)變數」,倘若我們少打了「var」來宣告的話,那會造成多大的影響呢?這裡我們就來比較一下兩者間的執行速度。

存取「區域變數」遠比「實體(時間軸)變數」快

區域變數

function test()
{
	var i = 10;
	for(var j = 0 ; j < 100000; j++)
	{
		i+=j;
	}
}
var start = getTimer();
test();
trace(getTimer()-start);

結果:(取決於電腦速度而有所不一)

114

實體(時間軸)變數

function test()
{
	i = 10;
	for(var j = 0 ; j < 100000; j++)
	{
		i+=j;
	}
}
var start = getTimer();
test();
trace(getTimer()-start);

結果:(取決於電腦速度而有所不一)

233

從結果來看,由於區域變數會使用到Flash Player內部所提供的暫存器來儲存之,造成兩者在上述的範例測試中,執行速度差距有二倍之多(114ms vs. 233ms),所以不可不慎!~

2007-06-29 17:38:37 | Add Comment

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

::: 搜尋 :::

::: 分類 :::

::: Ads :::

::: 最新文章 :::

::: 最新回應 :::

::: 訂閱 :::

Atom feed
Atom Comment