如何只将BitmapFilter呈现给BMD?

时间:2012-02-01 13:47:56

标签: flash actionscript-3 air filter bitmap

如何将应用于精灵的BitmapFilter(如DropShadowFilter)渲染为单独的BitmapData图层?然后将其放置在所有对象下面。

例如,如果你有两个相互重叠的矩形精灵,并且每个精灵都应用了一个DropShadowFilter,那么结果将是过滤器覆盖并遮蔽另一个矩形精灵 - 如下所示。

注意:每个过滤器可能有不同的设置,所以我不能只对包含的精灵应用均匀过滤器。 另外:理想情况下,此解决方案可以扩展,以同时处理许多动画精灵。

enter image description here

3 个答案:

答案 0 :(得分:1)

我想说最简单的方法是保留每个Sprite的大纲副本,你应用DropShadowFilter。在过滤器上,设置dropShadowFilter.hideObject = true; - 这将仅渲染阴影。然后将所有轮廓阴影添加到单个容器Sprite并使用addChildAt(container,0),因此它将呈现在其他所有内容之下。

答案 1 :(得分:1)

我的方法是将每个DisplayObject的过滤器属性knockout设置为trueBitmapData对象,然后将每个过滤器的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/display/BitmapData.html#applyFilter()

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/filters/BitmapFilter.html