Как сделать только BitmapFilter для BMD - PullRequest
3 голосов
/ 01 февраля 2012

Как бы вы отобразили BitmapFilter (например, DropShadowFilter), примененный к спрайту, к отдельному слою BitmapData?который затем будет помещен под всеми объектами.

Например, если у вас есть два прямоугольных спрайта, перекрывающих друг друга, с применением DropShadowFilter к каждому, результатом будет фильтр, перекрывающий и скрывающий другой прямоугольный спрайт - как показанониже.

примечание: каждый фильтр может иметь различные настройки, и поэтому я не могу просто применить унифицированный фильтр к содержащему спрайт. также: в идеале это решение будет масштабируемым для одновременной обработки множества анимированных спрайтов.

enter image description here

Ответы [ 3 ]

1 голос
/ 01 февраля 2012

Мой подход - рисовать каждый 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;
1 голос
/ 01 февраля 2012

Я думаю, что вы ищете 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

1 голос
/ 01 февраля 2012

Я бы сказал, что самый простой способ сделать это - сохранить контурную копию каждого из ваших спрайтов, к которому вы применяете DropShadowFilter. На фильтре установите dropShadowFilter.hideObject = true; - будет отображаться только тень. Затем добавьте все тени контура в один контейнер Sprite и используйте addChildAt(container,0), чтобы он отображался ниже всего остального.

...