2009年10月1日 星期四

Flash IDE 的遮罩在 reparentting 後的問題

遇到一個問題,在 Flash IDE 中的時間軸上所設計的遮罩,若是用程式將他 reparentting 後,會導致在新的 container(該遮罩的parent) 中,所有 child index 在該遮罩之上的 display object,都會被該遮罩所遮到。

下圖是 UI 的配置,mask_mc 遮 contain_mc,在這組遮罩的上下各有一個 green_mc 與 blue_mc:



以下是程式碼,主要工作是建立一個新的 mc1 放到 MainTimeline 上,然後將 MainTimeline 上的所有 DisplayObject 都移進 mc1 中,並在動作前後都作一些 trace:


var mc1:MovieClip = new MovieClip();
mc1.name = "NewContainer";
addChild(mc1);

function traceInfo(container:DisplayObjectContainer):void{
trace("traceInfo()", container.name);
for(var i:int=0; i trace(i, container.getChildAt(i).name);
}
trace("");
}

trace("初始時的 MainTimeline");
traceInfo(this);

for(var i:int = numChildren-1; i>=0; i--){
var obj:DisplayObject = getChildAt(i);
if(obj!=mc1){
mc1.addChildAt(obj, 0);
}
}
_mc.getC
trace("reparentting 後的 MainTimeline");
traceInfo(this);

trace("reparentting 後的 NewContainer");
traceInfo(mc1);

var yellowLine:MovieClip = new YellowLine();
yellowLine.name = "yellowLine";
mc1.addChild(yellowLine);

trace("在 NewContainer 新加入 DisplayObject 後");
traceInfo(mc1);



執行後的畫面:



從第一段 trace 可以看出,在 Flash IDE 中所設計的遮罩,從 child index 來說,mask_mc (index=1) 會在 content_mc (index=2) 的下面。

第三、四段 trace 可以看出,所有 DisplayObject 在移動前後的 child index 都是沒有改變的,但是從畫面上來看,除了 blueLine (index=0) 之外的所有 DisplayObject 都會被 mask_mc 所遮蔽,即使是最後用程式加入的 yellowLine (index=4) 也不例外。

感覺上,Flash IDE 設計的遮罩,會將 child index 在其上面的 DisplayObject 都遮蔽,或許還會有一個變數來定義遮多少個(亂猜的),而當 reparentting 後為何會影響到所有在其上的物件,這點我還沒想出來。

正在研究 DisplayObject.mask 的相關說明,不過有可能 Flash IDE 設計的遮罩有不同的實作方式也說不一定。

2 則留言:

匿名 提到...

不好意思,我想請問要如何用AS3寫出一個雙向互動的白板

Ben Chang 提到...

@匿名

你可以研究 Flash Media Server 相關技術,在 Adobe 官網上可以下載 FMS 4.5 developer 版本,這個版本具有完整功能,只是在連線數的部分有些限制,可供你進行完整測試。

FMS 通常具有一些範例程式碼,就我的經驗來說,以前的版本有包含電子白板的完整範例,你可直接使用、修改、或學習。