从下方在 AS3 中遮蔽,保持遮蔽可见?

Masking in AS3 from below, keeping mask visible?

好吧,我很确定这是不可能的,但也许有人可以想出一个巧妙的效果组合来实现这一点:

我想要一个[大的、复杂的]动画片段充当其上方另一个动画片段的遮罩,并且不会自行消失。

重点是让用户将各种对象拖到角色上,并让它们出现 "on the skin",因此仅在角色动画片段所在的位置可见。 以前我是通过创建一个与角色形状相同的面具来做到这一点的,但是这次角色 MC 是如此复杂和动态以至于它是不可行的。

有没有一种简单的方法可以动态复制复杂的 MC 并使其成为遮罩?有没有办法使用负 space 而不是内容来使擦除过滤器擦除?想法?

编辑:

起初,由于高像素化和缩放问题,下面的答案不起作用,但我能够通过绘制父对象来解决这些问题,允许按照建议进行平滑处理,并进行大量修改。

    // 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;

听起来您已经解决了这个问题,但我认为您必须创建第二个角色对象以用于遮罩。

Is there an easy way to dynamically duplicate the complex MC and make that the mask?

如果你的 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,并且必须将 displayobject 和 mask 对象的 cacheAsBitmap 都设置为 true。

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

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