Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 24.03.2012, 13:15
TanaTiX вне форума Посмотреть профиль Отправить личное сообщение для TanaTiX Найти все сообщения от TanaTiX
  № 1  
Ответить с цитированием
TanaTiX
 
Аватар для TanaTiX

блогер
Регистрация: Feb 2008
Сообщений: 1,453
Записей в блоге: 4
По умолчанию Изменение свойств фильтра(ов)

Есть некий DisplayObject, на который действует неопределенное количество фильтров.
В какой-то момент необходимо один или несколько из них "обновить", т.к. они поменяли ряд своих значений.
Как, если предположительно неизвестно что и как поменялось?
Пример кода:
Код AS3:
import flash.display.Sprite;
import flash.filters.DropShadowFilter;
 
var mc:Sprite=new Sprite();
mc.graphics.beginFill(0xff0000);
mc.graphics.drawCircle(100,100,100);
mc.graphics.endFill();
addChild(mc);
 
var filter:DropShadowFilter = new DropShadowFilter();
mc.filters=[filter];
 
filter.distance=50;
//вот тут необходимо обновить фильтр/отображение объекта, с учетом того, что количество примененных фильтров и ссылки на них не известны
__________________
Ну все, теперь Забава м-о-я.
Гы-гы, а корабль мой!

Старый 24.03.2012, 14:26
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 2  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Просто заново назначить массив фильтров... Или что именно неизвестно?
Код AS3:
var shadow:DropShadowFilter = new DropShadowFilter();
var blur:BlurFilter = new BlurFilter();
var blurShadow:Array = [shadow, blur];
 
mc.filters = blurShadow;
 
shadow.distance = 50;
mc.filters = blurShadow;
__________________
Reality.getBounds(this);

Старый 24.03.2012, 14:27
Deimos747 вне форума Посмотреть профиль Отправить личное сообщение для Deimos747 Найти все сообщения от Deimos747
  № 3  
Ответить с цитированием
Deimos747
 
Аватар для Deimos747

Регистрация: Mar 2011
Сообщений: 243
Код AS3:
for each(var oldFilter: Object in mc.filters) {
   if (oldFilter is DropShadowFilter) {
      for (var prop: String in filter) {
           DropShadowFilter(oldFilter)[prop] = filter[prop]
      }
      break;
   }
}
Я думаю, как то так

Старый 24.03.2012, 14:35
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 4  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Массив-то хранит ссылки на экземпляры фильтров, и когда фильтры меняются, "в массиве" они "тоже меняются". Но дело в том, что когда Вы отдавали массив свойству filters, фильтры применяются один раз как набор эффектов с установками (значениями). Автоматического обновления не происходит, так же как здесь:
Код AS3:
var b:Number = 500;
mc.width = b; // применили, mc стал шириной 500
b = 1000; // но mc не стал шириной 1000 ))
mc.width = b; // а вот теперь 1000.
__________________
Reality.getBounds(this);

Старый 24.03.2012, 16:48
TanaTiX вне форума Посмотреть профиль Отправить личное сообщение для TanaTiX Найти все сообщения от TanaTiX
  № 5  
Ответить с цитированием
TanaTiX
 
Аватар для TanaTiX

блогер
Регистрация: Feb 2008
Сообщений: 1,453
Записей в блоге: 4
Wolsh, да, то что необходимо назначить, - не известно.
Массив - объект ссылочного типа, думал что по сеттеру происходит сравнение массивов. Но нижеприведенный код на результате никак не отразился:
Код AS3:
var arr:Array = mc.filters;
var newArr:Array=[];
for each(var item:Object in arr){
	newArr.push(item);
}
mc.filters = newArr;
Очень бы не хотелось воспользоваться чем-то похожим на вариант Deimos747
__________________
Ну все, теперь Забава м-о-я.
Гы-гы, а корабль мой!


Последний раз редактировалось TanaTiX; 24.03.2012 в 17:58.
Старый 24.03.2012, 19:10
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 6  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
А как он должен был отразиться? Если ты скопировал и назначил обратно то же, что и было?
Код AS3:
var filtersArr:Array = [_shadow, _blur];
mc.filters = filtersArr;
trace(mc.filters == filtersArr); // false !
Добавлено через 11 минут
Цитата:
Очень бы не хотелось воспользоваться чем-то похожим на вариант Deimos747
И не придется, ибо он не будет работать. Я вроде объяснил, почему. И как будет работать, ответил. Если не знаете, каким объектам какие фильтры поназначили, то это уж не моя вина. Как обычно – чините архитектуру.
__________________
Reality.getBounds(this);

Старый 24.03.2012, 19:29
Inet_PC вне форума Посмотреть профиль Отправить личное сообщение для Inet_PC Посетить домашнюю страницу Inet_PC Найти все сообщения от Inet_PC
  № 7  
Ответить с цитированием
Inet_PC
 
Аватар для Inet_PC

Регистрация: Feb 2009
Адрес: Гы...поди, найди!
Сообщений: 853
Записей в блоге: 1
Ну, а в чем проблема то? Нужно обновить фильтры в любой момент времени?
Код AS3:
if (mc && mc.filters) mc.filters = mc.filters.concat();
Конкат тут так на всякий случай. Если без него работает, то лучше без него. И чем Вас ответ Wolsh-а не устроил?
__________________
http://www.chessmax.ru


Последний раз редактировалось Inet_PC; 24.03.2012 в 19:35.
Старый 24.03.2012, 19:56
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 8  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Нужно сначала получить фильтры, обновить их и засеттить заново.
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 24.03.2012, 21:19
Silicium вне форума Посмотреть профиль Отправить личное сообщение для Silicium Найти все сообщения от Silicium
  № 9  
Ответить с цитированием
Silicium
 
Аватар для Silicium

Регистрация: Sep 2010
Адрес: Ростов-на-Дону
Сообщений: 369
Почему бы не переопределить сеттер для фильтров и в нем все это реализовывать?

Старый 24.03.2012, 21:47
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 10  
Ответить с цитированием
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Silicium, отличная мысль!
FilteredSprite.as :
Код AS3:
package  
{
	import flash.display.Sprite;
	public class FilteredSprite extends Sprite 
	{
		private var _filterArray:Array = [];
 
		public function FilteredSprite() 
		{
 
		}
 
		override public function set filters(value:Array):void
		{
			_filterArray = value;
			super.filters = value;
		}
 
		public function updateFilters():void
		{
			super.filters = _filterArray;
		}
	}
}
Код AS3:
var mc:FilteredSprite = new FilteredSprite();
mc.graphics.beginFill(0x000000, 1);
mc.graphics.drawRect(0, 0, 200, 150);
addChild(mc);
mc.x = mc.y = 100;
var filtersArr:Array = [_shadow, _blur];
mc.filters = filtersArr;
 
_shadow.distance = 80;
mc.updateFilters(); // работает
__________________
Reality.getBounds(this);

Создать новую тему Ответ Часовой пояс GMT +4, время: 08:40.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


Часовой пояс GMT +4, время: 08:40.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.