从下方在 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;
好吧,我很确定这是不可能的,但也许有人可以想出一个巧妙的效果组合来实现这一点:
我想要一个[大的、复杂的]动画片段充当其上方另一个动画片段的遮罩,并且不会自行消失。
重点是让用户将各种对象拖到角色上,并让它们出现 "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;