2015-10-15 95 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