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

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

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

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
По умолчанию EventDispatcher - target, не понимаю

Цитата:
Целевой объект для событий, отправляемых объекту EventDispatcher. Этот параметр используется, когда экземпляр EventDispatcher агрегируется классом, внедряющим IEventDispatcher; это необходимо, чтобы содержащий его объект мог быть целью для событий.
По описанию, если я передам туда то, что реализует IEventDispatcher - это дело станет получать его события (?) что ли? Какой "внедрять" то, что уже "внедрено"? (IEventDispatcher же).

Просто не понимаю. Если не затруднит, объясните на примере. Спасибо.

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

Регистрация: Jan 2009
Сообщений: 3,067
Записей в блоге: 3
Отправить сообщение для GBee с помощью Skype™
Пример есть прямо в хелпе, вроде все понятно сразу.

Код AS3:
package {
        import flash.events.Event;
        import flash.display.Sprite;
 
        public class IEventDispatcherExample extends Sprite {
                public function IEventDispatcherExample() {
                        var decorDispatcher:DecoratedDispatcher = new DecoratedDispatcher();
                        decorDispatcher.addEventListener("doSomething", didSomething);
                        decorDispatcher.dispatchEvent(new Event("doSomething"));
                }
 
                public function didSomething(evt:Event):void {
                        trace(">> didSomething");
                }
        }
}
 
import flash.events.IEventDispatcher;
import flash.events.EventDispatcher;
import flash.events.Event;
 
class DecoratedDispatcher implements IEventDispatcher {       
    private var dispatcher:EventDispatcher;
 
    public function DecoratedDispatcher() {
        dispatcher = new EventDispatcher(this);
    }
 
    public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false):void{
        dispatcher.addEventListener(type, listener, useCapture, priority);
    }
 
    public function dispatchEvent(evt:Event):Boolean{
        return dispatcher.dispatchEvent(evt);
    }
 
    public function hasEventListener(type:String):Boolean{
        return dispatcher.hasEventListener(type);
    }
 
    public function removeEventListener(type:String, listener:Function, useCapture:Boolean = false):void{
        dispatcher.removeEventListener(type, listener, useCapture);
    }
 
    public function willTrigger(type:String):Boolean {
        return dispatcher.willTrigger(type);
    }
}
__________________
Чтобы доказать, что вы не робот, причините вред другому человеку.

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

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Допустим тебе надо чтобы некий класс рассылал события "от своего имени", но при этом ты не можешь наследовать его от EventDispatcher (т.к. наследуешь от другого). Однако обеспечить функционал ты можешь агрегированием (композицией), заведя в этом классе встроенный объект EventDispatcher. Загвоздка только в том, что если рассылать события через него, то target у события будет ссылкой на этот объект EventDispatcher, а не на агрегат. Поскольку речь идет не столько о дисплейных объектах, то получить ссылку на сам агрегат будет затруднительно и потребует новых геттеров или особого класса события - target.parent тут не поможет. Вот для этого target и переобъявляется (хехе ну и слово). Однако нам ведь нужна уверенность, что этот новый таргет сможет полноценно прикинуться EventDispatcher - на него ведь будут вешать листенеры и т.п. Значит он обязан имплементить интерфейс IEventDispatcher.
Пример:
Код AS3:
package  
{
	import flash.events.Event;
	import flash.events.EventDispatcher;
	import flash.events.IEventDispatcher;
	import flash.events.TimerEvent;
	import flash.utils.Timer;
 
	public class IEDClass implements IEventDispatcher
	{
		private var _dispatcher:EventDispatcher;
		private var _timer:Timer = new Timer(500);
 
		public function IEDClass() 
		{
			_dispatcher = new EventDispatcher(this);
			_timer.addEventListener(TimerEvent.TIMER, onTimer);
			_timer.start();
		}
		private function onTimer(event:TimerEvent):void
		{
			_dispatcher.dispatchEvent(new Event("tick"));
		}
 
		/* IEventDispatcher */
		public function addEventListener(type:String, listener:Function, useCapture:Boolean = false, priority:int = 0, useWeakReference:Boolean = false) : void
		{
			_dispatcher.addEventListener(type, listener, useCapture, priority, useWeakReference);
		}
		public function dispatchEvent (event:Event) : Boolean
		{
			return _dispatcher.dispatchEvent (event);
		}
 
		public function hasEventListener (type:String) : Boolean
		{
			return _dispatcher.hasEventListener (type);
		}
 
		public function removeEventListener (type:String, listener:Function, useCapture:Boolean = false) : void
		{
			_dispatcher.removeEventListener (type, listener, useCapture);
		}
 
		public function willTrigger (type:String) : Boolean
		{
			return _dispatcher.willTrigger(type);
		}
 
	}
 
}
Код AS3:
package 
{
	import flash.display.Sprite;
	import flash.events.Event;
	import flash.display.StageAlign;
	import flash.display.StageScaleMode;
 
	public class Main extends Sprite 
	{
		private var _ticker:IEDClass;
 
		public function Main():void 
		{
			if (stage) init();
			else addEventListener(Event.ADDED_TO_STAGE, init);
		}
 
		private function init(e:Event = null):void 
		{
			removeEventListener(Event.ADDED_TO_STAGE, init);
			_ticker = new IEDClass();
			_ticker.addEventListener("tick", onTick);
		}
 
		private function onTick(event:Event):void
		{
			trace(event.target, event.currentTarget); // "[object IEDClass] [object IEDClass]"
		}
	}
 
}
__________________
Reality.getBounds(this);

Старый 05.08.2010, 11:30
Psycho Tiger вне форума Посмотреть профиль Отправить личное сообщение для Psycho Tiger Найти все сообщения от Psycho Tiger
  № 4  
Ответить с цитированием
Psycho Tiger
 
Аватар для Psycho Tiger

блогер
Регистрация: Jun 2005
Адрес: Toronto
Сообщений: 6,599
Записей в блоге: 17
GBee, мне вот и не было понятно зачем указывать target. В Вашем примере если
вместо
Код AS3:
dispatcher = new EventDispatcher(this);
сделать
Код AS3:
dispatcher = new EventDispatcher(null);
ничего бы не изменилось.

Wolsh, спасибо теперь понятно. Что то не подумал о сходстве поля target у Event`а и аргумента target у ED.

UPD: Ха-ха, перечитал свой вопрос. Целью читал как цепью, да и даже читая как "цель" не очень очевидно, что имеется ввиду target. Наверное, стоит читать английиский хелп.

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

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

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


 


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


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