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

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

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

Регистрация: Feb 2009
Сообщений: 141
По умолчанию Не срабатывает MOUSE_OVER, ROLL_OVER при использовании InteractivePNG

В ряде случаев (мне не удалось найти точную причину) не срабатывают события MOUSE_OVER, ROLL_OVER подписываясь к экземпляру класса InteractivePNG. Не срабатывание событий имеет какую-то закономерность, которую узнать мне также не удалось, т.е. 80% случаев над одним объектом событие не срабатывает, у другого объекта событие срабатывает 100%. Допускаю что бачина имеет место быть для экземпляров InteractivePNG к дисплей листу которых были добавлены DisplayObjectContainer, которые в свою очередь имеют/не имеют DisplayObject/DisplayObjectContainer.

Вобщем целый день ковырял эту ситуацию, ровным счетом ничего. Помогите кто, чем может, может кто сталкивался с подобной ситуацией.

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

блогер
Регистрация: Feb 2008
Адрес: http://playtika.com
Сообщений: 1,119
Записей в блоге: 5
Отправить сообщение для СлаваRa с помощью ICQ Отправить сообщение для СлаваRa с помощью Skype™
минимальный пример "в студию!"
__________________
местонахождение

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

Регистрация: Feb 2009
Сообщений: 141
Сам объект на ROLL_OVER которого редко что происходит

Код AS3:
package ***
{
	***
 
	import flash.display.Bitmap;
	import flash.filters.DropShadowFilter;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
	import flash.text.TextFormat;
 
	public class SkullInfo extends InteractivePNGControl
	{
		private var __button:Button
		private var __background:Bitmap;
		private var __icon:Bitmap;
		private var __value:int = 0;
		private var __textField:TextField;
		private var __color:uint = 0x00;
		private var __tooltip:Tooltip;
 
		public function SkullInfo(controls:Controls)
		{
			super(controls);
 
			__refresh();
		}
 
		public function get button():Button
		{
			if (!__button)
			{
				__button = new Button(controls);
				__refresh();
			}	
 
			return __button;
		}
 
		public function set background(value:Bitmap):void
		{
			if (__background && __background.parent)
				this.removeChild(__background);	
 
			__background = value;
			__refresh();
		}
 
		public function get background():Bitmap
		{
			return __background;
		}
 
		public function set icon(value:Bitmap):void
		{
			if (__icon && __icon.parent)
				this.removeChild(__icon);
 
			__icon = value;
			__refresh();
		}
 
		public function get icon():Bitmap
		{
			return __icon;
		}
 
		public function set value(val:int):void
		{
			__value = val;
			__refresh();
		}
 
		public function get value():int
		{
			return __value;
		}
 
		public function set color(value:uint):void
		{
			__color = value;
			__refresh();
		}
 
		public function get color():uint
		{
			return __color;
		}
 
		public function set tooltip(value:String):void
		{
			if (!__tooltip)
				__tooltip = new Tooltip(controls, this);
 
			__tooltip.text = value;
		}
 
		public function get tooltip():String
		{
			return __tooltip.text;
		}
 
		private function __refresh():void
		{
			if (__background)
			{
				__background.y = 3;
				this.addChild(__background);
			}	
 
			if (__button)
			{
				__button.x = 65;
				__button.y = 5;
				this.addChild(__button);
			}	
 
			if (__icon)
			{
				__icon.x = 60;
				this.addChild(__icon);
			}	
 
			if (!__textField)
			{
				__textField = TextFormats.defaultTextField;
				__textField.filters = [new DropShadowFilter()];
			}
 
			__textField.defaultTextFormat = new TextFormat(TextFormats.EMBED_FONT, 13, __color);
			__textField.text = value.toString();
			__textField.autoSize = TextFieldAutoSize.LEFT;
 
			__textField.x = 35 - __textField.width / 2;
			__textField.y = 6;
			this.addChild(__textField);
		}
	}
}
Базовый класс, класса выше, ничего интересного

Код AS3:
package ***
{
	***
	import com.mosesSupposes.bitmap.InteractivePNG;
 
	public class InteractivePNGControl extends InteractivePNG implements IControl
	{
		private var __controls:Controls;
 
		public function InteractivePNGControl(controls:Controls)
		{
			super();
 
			__controls = controls;
		}
 
		public function get controls():Controls
		{
			return __controls;
		}
	}
}
Класс, в котором подписывается на события экземпляр класса SkullInfo
Подпись прямо в конструкторе.

Код AS3:
package ***
{
	***
	import com.ninemokeys.lib.BmdFactory;
 
	import flash.display.Bitmap;
	import flash.display.DisplayObject;
	import flash.display.InteractiveObject;
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.events.MouseEvent;
	import flash.geom.Rectangle;
	import flash.text.TextField;
	import flash.text.TextFieldAutoSize;
 
	public class Tooltip extends SpriteControl
	{
		private static const TOOLTIP_BACKGROUND_IMAGE:String = "images/ui/tooltipBackground.png?v=2";
 
		private var __object:InteractiveObject;
		private var __text:String;
		private var __textField:TextField;
		private var __background:Bitmap;
		private var __backgroundLoaded:Boolean = false;
		private var __container:Sprite;
 
		public function Tooltip(controls:Controls, object:InteractiveObject)
		{
			super(controls);
 
			__object = object;
 
			controls.images.addEventListener(ImagesEvent.IMAGES_LOAD_COMPLETE, __imagesLoadComplete);
			controls.images.loadImages([TOOLTIP_BACKGROUND_IMAGE]);
 
			__object.addEventListener(MouseEvent.ROLL_OVER, __over);
			__object.addEventListener(MouseEvent.ROLL_OUT, __out);
		}
 
		public function set text(value:String):void
		{
			__text = value;
 
			if (!__textField)
			{
				__textField = TextFormats.defaultTextField;
				__textField.defaultTextFormat = TextFormats.tooltipFormat;
			}
 
			__textField.text = __text;
			__textField.autoSize = TextFieldAutoSize.LEFT;
		}
 
		public function get text():String
		{
			return __text;
		}
 
		private function __imagesLoadComplete(e:ImagesEvent):void
		{
			controls.images.removeEventListener(ImagesEvent.IMAGES_LOAD_COMPLETE, __imagesLoadComplete);
 
			__backgroundLoaded = true;
		}
 
		private function __over(e:MouseEvent):void
		{
			if (__backgroundLoaded && __text)
			{
				if (!__background)
				{
					var background:Bitmap = controls.images.getLoadedImage(TOOLTIP_BACKGROUND_IMAGE);
 
					__container = new Sprite();
 
					__background = new Bitmap(
						BmdFactory.drawSliced9(
							BmdFactory.slice9(background.bitmapData, new Rectangle(4, 4, background.width - 6, background.height - 6)), __textField.width + 8, __textField.height + 8));
				}
			}	
			else
				return;
 
			__refreshTooltipPosition();
 
			__object.stage.addChild(__container);
			__container.addChild(__background);
			__textField.x = 3
			__textField.y = 3
			__container.addChild(__textField);
 
			this.addEventListener(Event.ENTER_FRAME, __onEnterFrame);
		}
 
		private function __out(e:MouseEvent):void
		{
			this.removeEventListener(Event.ENTER_FRAME, __onEnterFrame);
 
			if (__container && __container.parent)
				__container.parent.removeChild(__container);
		}
 
		private function __onEnterFrame(e:Event):void
		{
			__refreshTooltipPosition();	
		}
 
		private function __refreshTooltipPosition():void
		{
			if (__object.stage.mouseX + __container.width + 25 > __object.stage.stageWidth)
				__container.x = __object.stage.mouseX - __container.width - 15;
			else
				__container.x = __object.stage.mouseX + 15;
 
			__container.y = __object.stage.mouseY + 15
		}
	}
}
Пожалуй, это самый минимальный код одного из проблемных объектов, объекты поменьше проблем не имеют

Добавлено через 22 минуты
P.S Как только я базовый класс для проблемных объектов заменяю на Sprite, вместо InteractivePNG, все проблемы исчезают.

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

Регистрация: Jun 2012
Адрес: Новосибирск
Сообщений: 6,644
Записей в блоге: 4
В interactivepng используется приоритет слушателей 10000. Видимо действие просто отменяется, при определенных условиях. Возможно стоит подрегулировать свойство _threshold.
Хотя у меня и на дефолтных настройках такой проблемы не наблюдается

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

Регистрация: Feb 2009
Сообщений: 141
caseyryan, огромное спасибо, приоритет слушателей -1 порешал все проблемы. _threshold я уже регулировал, он не влиял на ситуацию.

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

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

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


 


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


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