如何将应用于精灵的BitmapFilter(如DropShadowFilter)渲染为单独的BitmapData图层?然后将其放置在所有对象下面。
例如,如果你有两个相互重叠的矩形精灵,并且每个精灵都应用了一个DropShadowFilter,那么结果将是过滤器覆盖并遮蔽另一个矩形精灵 - 如下所示。
注意:每个过滤器可能有不同的设置,所以我不能只对包含的精灵应用均匀过滤器。 另外:理想情况下,此解决方案可以扩展,以同时处理许多动画精灵。
答案 0 :(得分:1)
我想说最简单的方法是保留每个Sprite的大纲副本,你应用DropShadowFilter。在过滤器上,设置dropShadowFilter.hideObject = true;
- 这将仅渲染阴影。然后将所有轮廓阴影添加到单个容器Sprite并使用addChildAt(container,0)
,因此它将呈现在其他所有内容之下。
答案 1 :(得分:1)
我的方法是将每个DisplayObject
的过滤器属性knockout
设置为true
到BitmapData
对象,然后将每个过滤器的knockout
重置为原始州。一个简单的例子来证明这一点:
var s:Sprite = new Sprite();
s.graphics.beginFill(0xFF0000);
s.graphics.drawRect(0,0,40,40);
s.graphics.endFill();
var shadow:DropShadowFilter = new DropShadowFilter();
s.filters = [shadow];
function renderFilter(sprite:Sprite):Bitmap
{
var bd:BitmapData = new BitmapData(sprite.width * 1.2, sprite.height * 1.2, true); //extra 20% for the filter data, you might have to adjust this value depending on your filter's size
var filter:DropShadowFilter = sprite.filters[0];
var originalKnockout:Boolean = filter.knockout;
filter.knockout = true;
bd.draw(sprite);
filter.knockout = originalKnockout;
sprite.filters[0] = filter;
var bitmap:Bitmap = new Bitmap(bd);
return bitmap;
}
renderFilter(s); // here you have filter's rendering;
答案 2 :(得分:1)
我认为您正在寻找BitmapData.applyFilter()。它将任何BitmapFilter类型应用于您的BitmapData对象。位图过滤器是一组过滤器类型的父类,包括Blur,Glow和Shader过滤器。
http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/filters/BitmapFilter.html