2015-10-15 93 views
0

好吧,我敢肯定,這是不可能的,但也許有人能想到的效果整齊的組合,可以做到這一點的:從下面掩蓋AS3,保持掩碼可見?

我希望有一個[大型,複雜]影片剪輯充當遮罩到它上面的另一個影片剪輯,並且不會自行消失。

問題的關鍵在於讓用戶將各種對象拖放到角色上,並讓它們出現在「皮膚上」,因此只有在角色動畫片段所在的位置才能看到。 以前我通過創建一個與角色形狀相同的面具來完成這個任務,但是這次角色MC非常複雜而且動態,這是不可行的。

是否有一個簡單的方法來動態複製複雜的MC,並使該面具?有沒有辦法使用負空間而不是內容來擦除擦除過濾器?想法?

編輯:

起初下面的答案是行不通的,由於高像素化和擴展性問題,但我可以通過繪製父改爲讓平滑的建議,以及大量的修修補補來解決這些。

// remove old bitmap to replace with new one as needed 
    if(grl.tempContainer.numChildren >= 1){ 
     grl.tempContainer.removeChildAt(0); 
    } 
    // make hair disappear so only visible skin is part of mask 
    grl.hair.cacheAsBitmap = true; 
    grl.hair.blendMode = 'erase'; 
    grl.hair2.alpha = 0; 
    grl.ponytail.alpha = 0; 
    grl.body.braids.alpha = 0; 
    grl.filters = []; 
    grl.body.filters = []; 

    // create bitmap copy of the character 
    var bmd:BitmapData = new BitmapData(400, 600, true, 0); 
    bmd.draw(this.parent); 
    var clone:Bitmap = new Bitmap(bmd); 
    clone.cacheAsBitmap = true; 
    clone.smoothing = true; 
    grl.tempContainer.addChild(clone); 
    // undo the scaling effects that were on girl to revert to parent scaling/position 
    clone.scaleX = 1/grl.scaleX; 
    clone.scaleY = 1/grl.scaleY; 
    clone.x = -(clone.width)/2; 
    clone.y = -(75/(grl.scaleY)); 

    grl.draggieContainer5.cacheAsBitmap = true; 
    grl.draggieContainer5.mask = clone; 

    // reset character to look normal again 
    grl.hair.blendMode = 'normal'; 
    grl.hair2.alpha = 1; 
    grl.ponytail.alpha = 1; 
    grl.body.braids.alpha = 1; 
    grl.filters = filterHolder.filters; 
    grl.body.filters = filterHolder.filters; 

回答

0

這聽起來像你已經想通了,但我認爲你將不得不創建第二個字符對象用於面具。

有沒有簡單的方法來動態複製複雜的MC,並使 該面具?

如果你的mc是靜態的,你可以先把它繪製成位圖,然後用它作爲掩碼。

import flash.display.Bitmap; 

//Create Character 
var character:Character = new Character(); 
character.x = 100; 
character.y = 50; 
stage.addChild(character); 

//Clone it 
var bmd:BitmapData = new BitmapData(character.width, character.height, false, 0); 
bmd.draw(character); 
var clone:Bitmap = new Bitmap(bmd); 
clone.x = character.x; 
clone.y = character.y; 
stage.addChild(clone); 

//Tattoo is masked to the clone 
var tattoo:Tattoo = new Tattoo(); 
stage.addChild(tattoo); 
tattoo.mask = clone; 
stage.addEventListener(MouseEvent.MOUSE_MOVE, mousemove); 
function mousemove(e:MouseEvent):void 
{ 
    tattoo.x = mouseX; 
    tattoo.y = mouseY; 
} 

編輯:

既然你性格最有可能有透明區域,你實際上需要做一些更多的工作。 爲了給您的位圖的透明度,就需要第三個參數組爲true,和第四參數去0

var bmd:BitmapData = new BitmapData(grl.body.width, grl.body.height, true, 0); 

在你的角色身上,註冊點在中央,但繪製函數從左上角開始繪製。爲了正確繪製,你需要一個矩陣應用到抽獎功能:

//Apply Matrix so the entire image gets drawn 
var matrix:Matrix = new Matrix(); 
matrix.translate(grl.body.width/2, grl.body.height/2); 
bmd.draw(grl.body, matrix); 

//Draw the clone image 
var clone:Bitmap = new Bitmap(bmd); 

現在你的位圖應正確顯示,但它將被定位成與原始圖像的中心對齊的左上角。您需要將其移回原位,與以前位置相同。

var t:Transform = new Transform(clone); 
matrix = new Matrix(); 
matrix.translate(grl.body.x-grl.body.width/2, grl.body.y-grl.body.height/2); 
t.matrix = matrix; 
clone.scaleX = grl.body.scaleX; 
clone.scaleY = grl.body.scaleY; 

現在有兩件事你需要做,以便面具正確地與alpha通道混合。您必須將混合模式設置爲ALPHA,並且必須將displayAspect和mask對象的cacheAsBitmap設置爲true。

clone.cacheAsBitmap = true; 
clone.blendMode = BlendMode.ALPHA; 
grl.addChild(clone); 

grl.draggieContainer.cacheAsBitmap = true; 
grl.draggieContainer.mask = clone; 
+0

好吧,這絕對似乎是朝着正確的方向=) 我試圖將它集成到我的代碼。因爲我已經有了MC,所以我沒有使用第一部分。因爲我已經有了我的「draggieContainer」,所以我只使用最後一節的蒙版行。 但我在中間遇到各種各樣的麻煩..拖動新項目時,第一次沒有任何反應。接下來的一輪將會有一個巨大的,不透明的矩形形狀,其中包含我的角色,白色背景和draggie對象。我認爲這可以工作..我只需要解決這些問題.. –

+0

我的角色沒有註冊點在左上角,這是傷害我的大腦哈哈... –

+0

BitmapData構造函數中的第三個參數是布爾值爲透明度。您可以將其更改爲true以刪除白色背景。 – Karmacon