Применить фильтр ко всему в AS3
Я пытаюсь добавить фильтр в AS3/Flex SDK. Я могу просто добавить фильтр к любому отдельному объекту, но я хочу применить фильтр ко всему, что является потомком определенного объекта.
Подумайте, появляется окно паузы, и все, что находится под окном паузы, становится размытым.
Применение фильтра к каждому отдельному объекту (например, итерация по списку) не работает, так как фильтры из каждого объекта могут затем перекрываться и выглядеть довольно некрасиво.
Кто-нибудь знает, как это сделать? Есть ли способ применить фильтр ко всему?
Вот упрощенная версия кода:
myCanvas.graphics.beginFill(0x00FF00,0.5);
myCanvas.graphics.drawRect(0,0,100,100);
myCanvas.addChild(new vectorImage());
myCanvas.addChild(new vectorImage2());
var blur:BlurFilter = new BlurFilter();
myCanvas.filters = [blur];
Ни непосредственно нарисованная графика, ни дети не применяют эффект размытия. Я попытался изменить значения по умолчанию и пробовал другие фильтры:
var colors:Array = [0xEDEDED, 0xCCCCCC, 0x211b28, 0x211b28, 0x211b28];
var alphas:Array = [0, 1, .35, .5, 1];
var ratios:Array = [0, 50, 100, 115, 155];
myCanvas.filters = [new GradientGlowFilter(0, 0, colors, alphas, ratios, 50, 50, 1, 3, "full", false)];
С одинаковыми эффектами (то есть: нет). Что работает, это:
var vi:MovieClip = new vectorImage();
myCanvas.addChild(vi);
vi.filters = [blur];
но вызывает вышеупомянутые проблемы с несколькими фильтрами, не выравнивая должным образом.
4 ответа
На мой взгляд, у вас есть два возможных подхода:
поместите все, что вы хотите, чтобы размыть в отдельный контейнер, как остальные, и примените фильтры к этому контейнеру.
создайте BitmapData размера сцены (или части, которую вы хотите размыть), нарисуйте сцену, applyFilter, добавьте ее в список отображения (поверх всего) и поверх этого добавьте все спрайты, которые не должны быть размытым (я представляю окно предупреждения или подобное). Обратите внимание, что вы должны обновить BitmapData при изменении размера.
ОБНОВЛЕНИЕ: Ваш код кажется правильным, но я не знаком с Flex, поэтому, возможно, вы не можете добавить фильтры в Canvas (это DisplayObject?)... может быть, установка его cacheAsBitmap в false работает (иногда это довольно глючно)... Во всяком случае, что-то вроде этого должно сделать свое дело:
var container=new Sprite();
myCanvas.addChild(container);
container.addChild(new vectorImage());
container.addChild(new vectorImage2());
container.filters=[blur];
или, может быть, у Canvas уже есть свойство контейнера...
Приветствия...
Вы должны иметь возможность просто применить свое размытие к контейнеру. Свойство filters представляет собой массив. Попробуйте что-то вроде этого:
var blur:BlurFilter = new BlurFilter();
myCanvas.filters = [blur];
// в коде шкалы времени или классе документа
var blur:BitmapFilter = new BlurFilter(5, 5, BitmapFilterQuality.HIGH); var allFilters:Array = new Array(); allFilters.push(фильтр); filters = allFilers;
Если я правильно понимаю ваш вопрос, применение фильтров к сцене будет самой простой вещью, нет?
Greetz
back2dos