容器中的子顯示物件分為兩類:
處於顯示列表中的子顯示物件。被numchildren所記錄的。
由容器graphics物件繪製出來的向量圖。這個向量圖不屬於shape型別,不在容器的顯示列表中,不被numchildren所記錄。而是做為容器的背景向量圖存在,始終處於最後面。
因此,準確的說,如果要移除容器下所有子顯示物件,就要分別移除這兩類物件。
比如有乙個容器,其下有8個sprite子物件,和乙個graphics繪製出的影象:
var con:sprite = new sprite();
addchild(con);
for(var n:int =0; n<8; n++)
con.graphics.beginfill(0xff0000);
con.graphics.drawcircle(100,100,100);
con.graphics.endfill();
trace ("con's children:" + con.numchildren);
//輸出:con's children:8 graphics物件繪製的圖形果然不在其中。
先說,如何移除顯示列表中的顯示物件。
在as3中,容器對子物件的深度管理是自動的,深度是連續的。
每移除指定深度的顯示物件,那麼其他子顯示物件會移動並填充這個空位。因此,**編寫需要注意這一點。
容易誤寫的移除**:
//以下是錯誤**1:
for(var i:int=0; i < con.numchildren; i++)
con.removechildat(i);
}trace (con.numchildren); //輸出:4
錯誤原因:每次刪除1個子物件,後面的就填補上深度索引空缺,numchildren又會動態改變,因此出錯。這樣,實際只移除了四個顯示物件,分別是0,2,4,6這四個索引的顯示物件。因此,是錯誤的**。
//以下是錯誤**2:
for(var i:int=0; i < con.numchildren; i++)
con.removechildat(0);
}trace (con.numchildren); //輸出:4
錯誤原因:每次刪除乙個物件,雖然想每次刪除第0層,後面的就填補上深度索引空缺,numchildren又會動態改變,當con.numchildren = 4時, i = 4,迴圈無法繼續。
正確方式:
for(var i:int=con.numchildren-1; i>=0; i--)
或:var len:uint = con.numchildren;
while(len>0)
由於顯示列表會自動移動顯示物件填充空缺,所以只移除0索引的位置即可。這樣效率最高。
到這兒,大家可能會發現,雖然numchildren已經為0,但是graphics繪製的圓形仍然存在。所以最後,應當呼叫一句下面的**把它也清除掉,才算真正的移除了容器下所有的顯示內容。
con.graphics.clear();
as3中的容器
4種容器 array object vector dictionary 各自特點 array是索引陣列,雖然它也是動態類,可以等同於object來用,但是不建議這樣,因為沒有任何好處。除了鍵上的區別外,array還是善於隨機訪問的,但不知道object和dictionary和它在訪問速度上的區別有多...
AS3 四種容器
經過這一段時間學習,也有了自己的一些新的學習理念。學習應該是乙個一點到面的過程,急也沒有用 穩步前進,比如網頁前端開發,就應該從邏輯層 開始入手,逐步學習到內部引擎,並且掌握好as3的語言特性而不僅僅是語法。下面就是我對as3中vector,array,object,dictionary四大容器的理...
用AS3隨機化陣列
我們也許想在 中使用隨機化的數字序列,為了在不同的場合讓 表現的不一樣。因為在as3中我們沒法用陣列洗牌方法,所有只有自己寫一些 來實現這種效果了。這裡,我用as3給出了實現隨機數組的不同方法。最關鍵的一點是沒有使用迴圈語句。下面就是我列舉出來的隨機化陣列的不同演算法 1.沒有迴圈語句法 var r...