使用Flash AS3中的BlendMode“erase”时出现奇怪的行为

4

有人能解释一下在AS3中使用BlendMode.ERASE时如何避免看到线条吗?

这里有一个例子。我在舞台上绘制了一个黑色背景,然后在一个精灵上绘制了2个重叠的圆形,并尝试从背景中擦除它们。

            var solidBitmapData = new BitmapData(550,400,true,0x000000);
            var mySpriteLayer = new Sprite();

            // Create black background.
            mySpriteLayer.graphics.beginFill(0x000000);
            mySpriteLayer.graphics.drawRect(0,0,550,400);
            mySpriteLayer.graphics.endFill();

            // Draw it to bitmap data.
            solidBitmapData.draw(mySpriteLayer);

            // Clear sprite.
            mySpriteLayer.graphics.clear();

            // Draw two circles
            mySpriteLayer.graphics.beginFill(0xFF0000);
            mySpriteLayer.graphics.drawCircle(200,200,50);
            mySpriteLayer.graphics.endFill();
            mySpriteLayer.graphics.beginFill(0xFF0000);
            mySpriteLayer.graphics.drawCircle(250,200,50);
            mySpriteLayer.graphics.endFill();

            // Draw circles to bitmap with blend mode erase.
            solidBitmapData.draw(mySpriteLayer,null,null,BlendMode.ERASE);

            // Create bitmap and add to stage.
            var solidBitmap = new Bitmap(solidBitmapData);
            addChild(solidBitmap);

这里显示的是线条

我在谈论圆中间的那些线条。看起来与线条样式有关,但我已经尝试将其设置为零以及alpha设置为0,但无法去掉这些线条。

有什么想法吗?

3个回答

6

您需要将 'mySpriteLayer' 的 cacheAsBitmap 属性设置为 'true':

     mySpriteLayer.cacheAsBitmap = true;

混合模式对像素进行计算,因此它在光栅数据方面的表现比矢量数据更精确。


太好了。我确信我已经尝试过那个,但可能是因为我错过了它,所以它完美地运行了。 - Ben
有什么见解可以解释为什么它能够工作吗?我认为这是我见过的最不明显的修复之一:D - divillysausages
1
@divillysausages 请再次检查我的答案。 - Engineer
@user1113426 是的,我一开始不理解。调用draw()会将其转换为光栅图像,并使用BlendMode也是同样的道理,因此我不明白再次转换为光栅图像是如何发挥作用的 :) 现在我明白了。 - divillysausages
谢谢 - 这个解决了我一个类似的问题。 - tarling
谢谢,我的问题解决了。 - Katax Emperore

1
this.blendMode = BlendMode.LAYER;

Adobe的ActionScript 3.0参考文档中关于BlendMode类和ERASE字段的说明:

根据显示对象的alpha值擦除背景。此过程要求父显示对象的blendMode属性设置为flash.display.BlendMode.LAYER。


0
也许这就是Sprite混合模式对背景的反应方式。你试过在白色背景上放两个黑色圆圈吗?如果你看到相同的线条(只有白色),那么你可以得出结论,这就是混合模式的工作方式。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接