ActionScript 3 - 在同一个影片剪辑的图形上绘制两个形状,避免它们之间的alpha混合

时间:2010-09-07 00:55:55

标签: flash actionscript-3 actionscript alphablending

例如:

var mc:MovieClip=new MovieClip();

mc.graphics.beginFill(0x000000,0.5);
mc.graphics.drawRect(0,0,100,100);
mc.graphics.endFill();

mc.graphics.beginFill(0x000000,0.5);
mc.graphics.drawRect(0,0,100,100);
mc.graphics.endFill();

有了这个,我将得到一个暗于0.5的alpha值的盒子。我想要一个0.5 alpha的正方形而不使用像:

var mc:MovieClip=new MovieClip();

mc.graphics.beginFill(0x000000,1);
mc.graphics.drawRect(0,0,100,100);
mc.graphics.endFill();

mc.graphics.beginFill(0x000000,1);
mc.graphics.drawRect(0,0,100,100);
mc.graphics.endFill();

var bmp:BitmapData=new BitmapData(100,100);
bmp.draw(mc);
var mc2:MovieClip=new MovieClip();
mc2.graphics.beginBitmapFill(bmp);
mc2.graphics.drawRect(0,0,100,100);
mc2.graphics.endFill();

obvoiusly我不希望它用于绘制正方形,它用于我正在进行的阴影投射算法。

2 个答案:

答案 0 :(得分:1)

根据您的操作,您可以将所有内容绘制为alpha 1,将对象本身的alpha设置为0.5,然后使用LAYER混合模式,在应用alpha之前展平透明度。

var mc:MovieClip = new MovieClip();
addChild(mc);

var sp:Shape;

sp = new Shape();
sp.graphics.beginFill(0x000000,1);
sp.graphics.drawRect(0,0,100,100);
sp.graphics.endFill();
mc.addChild(sp);

sp = new Shape();
sp.graphics.beginFill(0x000000,1);
sp.graphics.drawRect(50,50,100,100);
sp.graphics.endFill();
mc.addChild(sp);

mc.alpha = 0.5;
mc.blendMode = BlendMode.LAYER;

这有点令人费解,但你明白了。

但是,使用位图对性能来说是最好的。同样,它取决于你必须实现什么以及如何实现。

此外,根据您需要绘制的内容,如果您可以依赖drawPath(),则可以将其设置为GraphicsPathWinding.NON_ZERO

答案 1 :(得分:0)

您可以使用ColorTransform,而不是使用alpha。使用TweenMax,它非常简单,但当然您可以编写自己的解决方案。

var mc:MovieClip=new MovieClip();
mc.graphics.beginFill(0xffffff); mc.graphics.drawRect(0,0,100,100); mc.graphics.endFill();
TweenMax.to( mc , 0 , {colorTransform:{tint:0x000000 , tintAmount:.5}} );

mc.graphics.beginFill(0xffffff); mc.graphics.drawRect(0,0,100,100); mc.graphics.endFill();
TweenMax.to( mc , 0 , {colorTransform:{tint:0x000000 , tintAmount:.5}} );