好吧,我很确定这是不可能的,但也许有人可以想到一个可以实现这一目标的巧妙的效果组合:
我想要一个[大而复杂的]动画片段作为其上方另一个动画片段的掩码,而不是自己消失。
关键是让用户将各种对象拖到角色上,然后让它们显示在“皮肤上”,这样只能在角色动画片段的位置显示。 以前我通过创建一个与角色形状相同的面具来做到这一点,但这次角色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 :(得分: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,并且必须为displayobject和mask对象设置cacheAsBitmap为true。
clone.cacheAsBitmap = true;
clone.blendMode = BlendMode.ALPHA;
grl.addChild(clone);
grl.draggieContainer.cacheAsBitmap = true;
grl.draggieContainer.mask = clone;