从下面掩盖AS3,保持掩码可见?
问题描述:
好吧,我敢肯定,这是不可能的,但也许有人能想到的效果整齐的组合,可以做到这一点的:从下面掩盖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;
答
这听起来像你已经想通了,但我认为你将不得不创建第二个字符对象用于面具。
有没有简单的方法来动态复制复杂的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;
好吧,这绝对似乎是朝着正确的方向=) 我试图将它集成到我的代码。因为我已经有了MC,所以我没有使用第一部分。因为我已经有了我的“draggieContainer”,所以我只使用最后一节的蒙版行。 但我在中间遇到各种各样的麻烦..拖动新项目时,第一次没有任何反应。接下来的一轮将会有一个巨大的,不透明的矩形形状,其中包含我的角色,白色背景和draggie对象。我认为这可以工作..我只需要解决这些问题.. –
我的角色没有注册点在左上角,这是伤害我的大脑哈哈... –
BitmapData构造函数中的第三个参数是布尔值为透明度。您可以将其更改为true以删除白色背景。 – Karmacon