日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

(转)AS3中的stage,this,root的区别

發(fā)布時(shí)間:2023/12/10 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (转)AS3中的stage,this,root的区别 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

要了解這個(gè)問(wèn)題就要先對(duì)flash中的顯示對(duì)象結(jié)構(gòu)有一個(gè)大概的了解:

?

第一級(jí):舞臺(tái);

?

第二級(jí):當(dāng)前SWF;

?

第三級(jí):各種容器及可視對(duì)象(如:文本框,位圖……);

?

以此類(lèi)推…………

?

stage:

?

其中舞臺(tái)(Stage)是最根本的容器,包含當(dāng)前SWF的所有顯示對(duì)象,每個(gè)flash程序只能有一個(gè)舞臺(tái)容器。

?

所有顯示對(duì)象的stage屬性指向舞臺(tái)。

?

root:

?

在舞臺(tái)下面的也是一個(gè)容器,被稱(chēng)作當(dāng)前SWF主類(lèi)的實(shí)例(注:AS3.0中所有容器直接或間接繼承自DisplayObjectContainer類(lèi)),在AS3.0中,每一個(gè)SWF都和一個(gè)類(lèi)相關(guān)聯(lián),這個(gè)類(lèi)就稱(chēng)為SWF的主類(lèi),如果沒(méi)有設(shè)定文檔類(lèi),則MainTimeline類(lèi)(注:MainTimeLine是MovieClip的子類(lèi))就是主類(lèi)。而root就指向當(dāng)前SWF主類(lèi)的實(shí)例(注:在AS2.0中,_root.指代絕對(duì)路徑)。

?

this:

?

this關(guān)鍵字持有對(duì)當(dāng)前對(duì)象的引用,編譯器將this關(guān)鍵字加在類(lèi)中每一個(gè)調(diào)用實(shí)例屬性和實(shí)例方法的地方。

?

this關(guān)鍵字常見(jiàn)使用情況:

?

(1)向第三方提供對(duì)象自身的引用。

?

(2)與return結(jié)合,在類(lèi)方法中返回自身的引用。

?

(3)和局部變量,方法參數(shù),靜態(tài)屬性同名時(shí),加上this關(guān)鍵字明確指定使用實(shí)例屬性。

?

1.STAGE是根,是最頂層的容器!可以通過(guò)STAGE的任何子容器或顯示

?

對(duì)象以DisplayObjectContainer.stage(需注意的是stage是小寫(xiě),如果在時(shí)間軸上trace(stage.width)是正確的,如果寫(xiě)成trace(Stage.width則會(huì)報(bào)錯(cuò)))或DisplayObject.stage訪問(wèn)到Stage類(lèi)的

?

唯一實(shí)例stage.就連主時(shí)間軸也是stage容器的子容器。

例如。你在主時(shí)間軸上寫(xiě)上代碼:trace(this);輸出的是什么呢?因?yàn)槟闶窃谥?/p>

?

時(shí)間軸上寫(xiě)的。所以返回的是一個(gè)對(duì)象:MainTimeLine,也就是主時(shí)間軸了。同

?

志們可以試試在主時(shí)間軸上寫(xiě):trace(this.stage);當(dāng)然輸出的是Stage對(duì)象了

?

。也可以省略不寫(xiě)this,直接寫(xiě):trace(stage);輸出的還是Stage對(duì)象。為了更清

?

楚,在主時(shí)間軸上寫(xiě)上代碼:trace(stage.getChildAt(0));看看輸出的是什么

?

呢?如果是MainTimeLine的話,就更能說(shuō)明問(wèn)題了,主時(shí)間軸是stage容器的第

?

一個(gè)子容器,在索引位置0上。

?

2.stage.width 與stage.stageWidth

?

我記得width相當(dāng)于sprite的width,是stage上所有child構(gòu)成的范圍的寬(

?

沒(méi)東西width就是0),stageWidth就是舞臺(tái)的寬

其實(shí)這個(gè)問(wèn)題很簡(jiǎn)單,但是你為什么不自己用個(gè)兩個(gè)文本框在各種不同的情況下

?

顯示一下這兩個(gè)的值呢。

?

Java代碼

1.stage.addEventListener(MouseEvent.CLICK,update);??

2.?

3.function update(e)??

4.{??

5.?? txt.text = String(stage.stageWidth);??

6.?

7.?? txt1.text = String(stage.width);??

8.}?

stage.addEventListener(MouseEvent.CLICK,update);

?

function update(e)

{

?? txt.text = String(stage.stageWidth);

?

?? txt1.text = String(stage.width);

}

?

?

?

自己看看吧,改變一下舞臺(tái)的大小,場(chǎng)景上的東西,還有環(huán)境,縮放,

?

自己試出來(lái)的結(jié)果永遠(yuǎn)比別人講的來(lái)的清晰

?

?

?

3.這兩天看AS3 cookbook和AS3的幫助文檔,里面很多代碼執(zhí)行后都會(huì)出現(xiàn)“TypeError: Error #1009: 無(wú)法訪問(wèn)空對(duì)象引用的屬性或方法。”這個(gè)錯(cuò)誤。幾經(jīng)周折,才知道解決辦法:使用addEventListener( Event.ADDED_TO_STAGE, enterDLHandle ),把要用的stage代碼放到enterDLHandle里面,就沒(méi)問(wèn)題了。不知道有沒(méi)有其他解決方法,知道的說(shuō)聲啊~

?

在經(jīng)典論壇上提問(wèn)這個(gè)問(wèn)題,終于有人做出全面回答了,在此感謝zjs35

?

首先要明白stage是什么意思,stage是顯示對(duì)象的一個(gè)引用舞臺(tái)的屬性,如果顯示對(duì)象不在顯示列表中,即沒(méi)有用addChild()添加,stage等于null,你的問(wèn)題就在這里。

使用stage有下面幾種方法:

1、文檔類(lèi)的構(gòu)造函數(shù)中可以直接使用stage屬性

2、非文檔類(lèi)可以通過(guò)參數(shù)傳遞到類(lèi)里面。

class Test extends Shape

{

function Test(stage:Stage)

{

}

}

3、不想傳遞參數(shù)時(shí),要注意代碼的順序。

class Test extends Shape

{

function Test()

{

}

functon useStage()

{

trace(stage)

}

}

這樣使用

var test=new Test()

test.useStage()//null,你的問(wèn)題出在這里

addChild(test)//添加到顯示列表后,就可以使用stage屬性。

test.useStage()//[object Stage]

總之,理解stage是顯示對(duì)象的屬性,位于顯示列表中的顯示對(duì)象的stage才引用舞臺(tái)

?

AS3.0 中root和parent的用法

一、首先看一下在單個(gè)swf中的用法:

在主舞臺(tái)上的幀上寫(xiě)下如下代碼:

var xxx="this is root";

新建一個(gè)MC,給它一個(gè)實(shí)例名稱(chēng)test_mc1,在test_mc1中的幀上寫(xiě)下如下代碼:

trace(parent["xxx"]);

trace(root["xxx"]);

trace(root["test_mc1"].alpha)

最終的輸出為:

this is root this is root

1

如果在test_mc1中在建立一個(gè)實(shí)例名稱(chēng)為test_mc2的movieclip,如何trace它的alpha呢:

trace(root["test_mc1"].test_mc2.alpha);

最終輸出“1”。

?

二、如果是兩個(gè)swf,他們之間是怎樣操作的呢:

新建兩個(gè)flash文件,命名為a1和a2,

在a1.fla中的幀上寫(xiě)下如下代碼:

var xxx="this is root";

var myloader=new Loader();

myloader.load(new URLRequest("a2.swf"));

addChild(myloader);

在a2.fla中建立一個(gè)動(dòng)態(tài)文本框,實(shí)例名稱(chēng)為txt;

在幀中寫(xiě)下如下代碼:

txt.text=parent.root["xxx"];

分別發(fā)布兩個(gè)flash文件,然后運(yùn)行a1.swf,看到其顯示結(jié)果為"this is root";

在發(fā)布a2.swf是你會(huì)看到:

ReferenceError: Error #1069: 在 flash.display.Stage 上找不到屬性 xxx,且沒(méi)有默認(rèn)值。

at a2_fla::MainTimeline/a2_fla::frame1()

不用去理它,因?yàn)樗皇峭ㄟ^(guò)a1.swf load到場(chǎng)景,所以找不到xxx這個(gè)參數(shù)。

這里的第一個(gè)parent是a1.swf中的myloader,myloader的再上一級(jí)才能找到xxx這個(gè)參數(shù),這里也可以寫(xiě)成parent.parent["xxx"]。

我想通過(guò)這兩個(gè)例子應(yīng)該比較清楚如何在AS3中使用root和parent了。

?

但as3的root在類(lèi)型轉(zhuǎn)換上出現(xiàn)的問(wèn)題具有普遍性

as3的文檔類(lèi)通常使用Sprite或MovieClip,但實(shí)際上繼承DisplayObject的類(lèi),在理論上均可做文檔類(lèi)

故adobe在設(shè)計(jì)root時(shí),

設(shè)計(jì)為root:DisplayObject

?

很多時(shí)候需要使用root as MovieClip來(lái)使用gotoAndStop一類(lèi)腳本 這在前一篇文章中(AS2中的_root,在AS3的用法)已經(jīng)說(shuō)過(guò)了

?

我通過(guò)這段時(shí)間對(duì) AS 3.0 的研究, 發(fā)現(xiàn)下面這個(gè)很有價(jià)值的問(wèn)題, 所以今天寫(xiě)下來(lái), 給大家分享.

?

?

Action Script 2.0 中 this 的用法:

在 Flash 里拖一個(gè) Button 組件到舞臺(tái), 給這個(gè) Button 實(shí)例取個(gè)名字叫 b1, 在 b1 身上添加代碼:

?

[復(fù)制到剪貼板]CODE:on (click) {

this.label = "你點(diǎn)了這個(gè)按鈕一下";

}

?

這里的 this 指的就是 Button 對(duì)象 b1, 點(diǎn)擊 b1 之后, b1的標(biāo)簽馬上變?yōu)?#34;你點(diǎn)了這個(gè)按鈕一下". 也就是說(shuō), 在 AS 2.0 中 this 指的是使用該方法的當(dāng)前對(duì)象.

?

?

Action Script 3.0 中 this 的用法:

在 Flex Builder 的 Design 模式下拖一個(gè) Button 到舞臺(tái), 給這個(gè)實(shí)例取名, 也就是設(shè)置 id 的值, 還是取名 b1, 然后回到 Source 模式下, 添加代碼:

?

[復(fù)制到剪貼板]CODE:<mx:Button id="b1" click="this.label="你點(diǎn)了這個(gè)按鈕一下";"/>

?

當(dāng)你運(yùn)行之后就會(huì)發(fā)現(xiàn), 點(diǎn)了 b1 之后, b1 的標(biāo)簽并沒(méi)有任何改變, 這是因?yàn)? this 關(guān)鍵字并不是指的 b1 這個(gè)按鈕, 而是指的 Application 的實(shí)例, 所以, 點(diǎn)了按鈕之后, 實(shí)際上企圖修改的是 Application 的標(biāo)簽, 而不是 b1 這個(gè)按鈕的標(biāo)簽.

?

因此正確的代碼應(yīng)該是:

?

[復(fù)制到剪貼板]CODE:<mx:Button id="b1" click="b1.label="你點(diǎn)了這個(gè)按鈕一下";"/>

?

原因是這樣的: 每個(gè) MXML Application 在保存以后, 實(shí)際上都被編譯成了一個(gè) AS 3.0 的類(lèi)(類(lèi)名跟 MXML 文件名相同), this 指的是這個(gè)類(lèi)本身的實(shí)例, 所以 this 的用法跟 AS 2.0 大相徑庭, 完全兩碼事.

?

?

總之, 在 AS 3.0 中, this 永遠(yuǎn)是指當(dāng)前頂級(jí)類(lèi)的一個(gè)實(shí)例(對(duì)象), 細(xì)分下面幾種情況:

?

1. 在 MXML Applcation 文件中, this 永遠(yuǎn)指的是 Application 的實(shí)例;

?

2. 在 MXML Component 文件中, this 永遠(yuǎn)指的是 Componet 的實(shí)例, 也就是這個(gè)文件中根元素的實(shí)例;

?

3. 在 Action Script Class 文件中, this 永遠(yuǎn)指的是這個(gè) Class 的實(shí)例;

?

4. 如果 MXML Component 和 Action Script Class 都被導(dǎo)入到 MXML Applcation 中, 在這個(gè) MXML Applcation 里 this 關(guān)鍵字依然還是指 Application 的實(shí)例, 而不是其中任何子元素的實(shí)例.

?

好了, 這就是我最近研究 AS 3.0 發(fā)現(xiàn)的一個(gè)典型問(wèn)題, 希望對(duì)大家有幫助 :-)

?

轉(zhuǎn)載于:https://www.cnblogs.com/wonderKK/archive/2012/05/14/2498911.html

總結(jié)

以上是生活随笔為你收集整理的(转)AS3中的stage,this,root的区别的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。