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

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

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

Регистрация: Nov 2009
Адрес: Тула / Москва
Сообщений: 734
Отправить сообщение для ChuwY с помощью ICQ Отправить сообщение для ChuwY с помощью Skype™
По умолчанию Зависание фильтров на объекте

Сделал для приложения что-то вроде менеджера всплывающих сообщений.
Хотелось, чтобы при показе сообщения остальной фон размывался.
Для этого стал засовывать все остальное в контейнер, на который вешал фильтры.
При отладке в десктопном плеере или через билдер все было отлично.
Но как только залил в контакт с отображением начались странности.
После убирания сообщения фон все равно оставался размыленным "протираясь" курсором (кастомным) или другими движущимися объектами. Не понимаю такое поведение.
Вот несколько упрощенный код менеджера и минимальное приложение для воспроизведения ситуации.
Помогите понять, что я делаю не так.
(если открыть закоменченные строки, все начинает, естественно, работать как надо... Но хочется без них, тк чуть меньше задержка. Да и вообще разобраться хочется)

Код AS3:
package {
	import flash.display.MovieClip;
	import flash.display.DisplayObject;
	import flash.events.MouseEvent;
	import flash.events.Event;
	import flash.display.Sprite;
	import flash.events.KeyboardEvent;
	import flash.filters.BlurFilter;
	import flash.display.Bitmap;
 
 
	public class Main extends MovieClip {
    private static const BG_FILTERS_ARRAY     : Array = new Array(new BlurFilter(7, 7, 1));
		private var _messageLayer : Sprite = new Sprite();
		private var _contentLayer : Sprite = new Sprite();
		private var _messageBox   : Sprite = new Sprite();
		public function Main(){
			addChild(_contentLayer);
			addChild(_messageLayer);
 
			_contentLayer.addChild(new Bitmap(new img_content()));
			_messageBox.addChild(new Bitmap(new img_message()));
 
			PopUpsMgr.instance.init(_messageLayer, _contentLayer);
			stage.addEventListener(KeyboardEvent.KEY_DOWN, keyDownHandler);
		}
 
		private function keyDownHandler(event : KeyboardEvent):void{
		  trace("keyDownHandler");
			if(_messageBox.parent){
				_messageBox.dispatchEvent(new Event(Event.CLOSE));
			} else {
				PopUpsMgr.instance.showSomeDO(_messageBox);
			}
		}
	}
}

Код AS3:
package{
  import flash.display.Bitmap;
  import flash.display.BitmapData;
  import flash.display.DisplayObject;
  import flash.display.DisplayObjectContainer;
  import flash.display.Sprite;
  import flash.display.Stage;
  import flash.events.Event;
  import flash.events.MouseEvent;
  import flash.filters.BlurFilter;
  import flash.filters.DropShadowFilter;
  import flash.geom.ColorTransform;
 
  /**
	 * @author Chu
	 */
 
	public class PopUpsMgr{
		private static const BG_COLOR_TRANSFORM   : ColorTransform = new ColorTransform(0.9, 0.9, 0.9);
		private static const BG_FILTERS_ARRAY     : Array = new Array(new BlurFilter(7, 7, 1));
		private static const MSGBOX_FILTERS_ARRAY : Array = new Array(new DropShadowFilter(0, 0, 0x0, 1, 35, 35, 2, 2));
		private static var _instance : PopUpsMgr;
		private var _bluredContentContainer : Sprite;
		private var _msgsContainer          : DisplayObjectContainer;
		private var _contContIndexInParent  : int;
		private var _parentContentContainer : DisplayObjectContainer;
    private var _contentContainer       : DisplayObjectContainer
		private var _turn                   : Vector.<DisplayObject>;
 
		public function PopUpsMgr(signature : SingletonEnforcer) {
			if(signature == null) {
				throw new Error("PopUpsMgr is a singleton class, use 'instance' instead");
			}
			_turn = new Vector.<DisplayObject>();
 
			_bluredContentContainer = new Sprite();
			_bluredContentContainer.mouseChildren = false;
			_bluredContentContainer.filters = BG_FILTERS_ARRAY;
			_bluredContentContainer.transform.colorTransform = BG_COLOR_TRANSFORM;
		}
 
		// static methods
		public static function get instance() : PopUpsMgr {
			if(_instance == null) {
				_instance = new PopUpsMgr(new SingletonEnforcer());
			}
			return _instance;
		}
 
		// methods
		public function init(msgContainer : DisplayObjectContainer, contentContainer : DisplayObjectContainer):void{
			_msgsContainer    = msgContainer;	
			_contentContainer = contentContainer;
			_msgsContainer.addChild(_bluredContentContainer);			
		}
 
		public function showSomeDO(DO : DisplayObject):void{
			DO.x = (_msgsContainer.stage.stageWidth - DO.width)/2;
			DO.y = (_msgsContainer.stage.stageHeight - DO.height)/2;
			DO.addEventListener(Event.CLOSE, msgBoxCloseHandler);
			DO.filters = MSGBOX_FILTERS_ARRAY;
			standToTurn(DO);	
		}
 
		// private functions
		private function standToTurn(msBox : DisplayObject):void{
			if(_turn.length){
				removeFromUp(_turn[_turn.length-1]);
			} else {
				hideBg();
			}
			_turn.push(msBox);
			addToUp(msBox);
		}
 
		private function msgBoxCloseHandler(event : Event):void{
		  var closedMsgBox : DisplayObject = _turn[_turn.length -1];	
 
			removeFromUp(closedMsgBox);
			closedMsgBox.removeEventListener(Event.CLOSE, msgBoxCloseHandler);
 
			_turn.splice(_turn.length - 1, 1);
 
			if(_turn.length){ 	// в очереди еще есть сообщения
				addToUp(_turn[_turn.length -1]);
			} else {
				showBg();
			}
		}
 
		private function hideBg():void{
			//_bluredContentContainer.filters = BG_FILTERS_ARRAY;
			_parentContentContainer = _contentContainer.parent;
			_contContIndexInParent  = _parentContentContainer.getChildIndex(_contentContainer);
			_bluredContentContainer.addChild(_contentContainer);
		}
 
		private function showBg():void{
			_parentContentContainer.addChildAt(_contentContainer, _contContIndexInParent);  
			//_contentContainer.visible = true;
		}
 
		private function addToUp(child : DisplayObject):void{
			_msgsContainer.addChildAt(child, _msgsContainer.numChildren); 
		}
 
		private function removeFromUp(child : DisplayObject):void{
			_msgsContainer.removeChild(child);
		}
	}
}
 
internal class SingletonEnforcer {}
И чтобы не надо было самим искать картинки для линкования с img_* -- пример прикреплен. (жмякните клавишу, чтобы проверить)
В приаттаченном примере все встанет на свои места, если после возникновения глюка изменить масштаб.
И да. Открывать через браузер.
Всем заранее спасибо.
Вложения
Тип файла: rar test.rar (72.9 Кб, 17 просмотров)


Последний раз редактировалось ChuwY; 02.02.2011 в 14:48.
Создать новую тему Ответ Часовой пояс GMT +4, время: 00:38.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

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

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


 


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


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