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

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

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

Регистрация: Jan 2010
Сообщений: 147
По умолчанию ивентная модель Flash

Господа, опасаюсь, что затронул тему, на которую мне никто ничего не напишет, кроме как читай книги и т.д. Я хотел бы понять на примере какой-то схемы или абстракции как работает ивентная модель во Flash. Как взаимодействуют диспатчер с листнером, контроллером? Может кто-то решиться на пальцах объяснить или стрелочками показать как это устроено внутри...

Старый 11.03.2010, 21:56
Gaen вне форума Посмотреть профиль Отправить личное сообщение для Gaen Найти все сообщения от Gaen
  № 2  
Ответить с цитированием
Gaen
strange mood
 
Аватар для Gaen

модератор форума
Регистрация: Jul 2004
Адрес: Питер
Сообщений: 1,653
Записей в блоге: 1
Отправить сообщение для Gaen с помощью ICQ Отправить сообщение для Gaen с помощью Skype™
http://help.adobe.com/en_US/ActionSc...0204-7e4f.html вот вам со стрелочками
__________________
тонкий тролль, осеянный благодатью

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

Регистрация: Jul 2007
Адрес: Гражданин Российской Федерации
Сообщений: 1,122
Отправить сообщение для KiL33 с помощью ICQ
Потратил два часа жизни, получился вот такой примерчик
main.rar

Класс Main

Код AS3:
package {
	import components.CreateWindow;
	import events.CommonEvent;
	import flash.display.Sprite;
	import flash.events.*
	import flash.text.*
 
	public class Main extends Sprite {
		public var createWindow:CreateWindow;
 
		public function Main(){
 
			init()
		}
 
		private function init():void {
 
			createWindow = new CreateWindow()
			addChild(createWindow)
			//получаем события из CreateWindow
			createWindow.addEventListener(CommonEvent.DRAG_WINDOW_DOWN, WinDragStart);
			createWindow.addEventListener(CommonEvent.DRAG_WINDOW_UP, WinDragStop);
			createWindow.addEventListener(CommonEvent.WINDOW_REMOVE, RemoveWindow);
 
		}
 
		private function WinDragStart(e:CommonEvent):void{
			trace("Drag_Start")
			var val:uint = e.t
			e.target.startDrag()
			e.target.alpha = Number("0."+val)
		}
 
		private function WinDragStop(e:CommonEvent):void{
			trace("Drag_Stop")
			var val:uint = e.t
			e.target.stopDrag()
			e.target.alpha = Number(val)
		}
		private function RemoveWindow(e:CommonEvent):void{
			trace("Remove")
			removeChild(createWindow);
		}
	}
}
Класс CreateWindow в пакете components

Код AS3:
package components {
 
	import events.CommonEvent;
	import flash.display.Sprite;
	import flash.display.Shape;
	import flash.events.*
 
	public class CreateWindow extends Sprite {
 
		private var container:Sprite;
		private var line:Shape;
		private var line2:Shape;
 
		private var closeWindow:CloseWindow;
 
		public function CreateWindow(){
		closeWindow = new CloseWindow()
			line = new Shape()
				line.graphics.lineStyle(2,0xFFFFFF)
			line.graphics.lineTo(10, 10);
			line.x = 85
			line.y = 5
 
////////////line2
 
			line2 = new Shape()
				line2.graphics.lineStyle(2,0xFFFFFF)
			line2.graphics.lineTo(10, 10);
			line2.rotation = 90
			line2.x = 95
			line2.y = 5
 
			container = new Sprite()
			container.graphics.beginFill(0xCCFF00);
				container.graphics.drawRect(0, 0, 100, 100);
			container.graphics.endFill()
 
			container.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownHandler);
			container.addEventListener(MouseEvent.MOUSE_UP, mouseUpHandler);
			closeWindow.addEventListener(MouseEvent.MOUSE_DOWN, mouseDownRemove);
 
			addChild(container)
			addChild(closeWindow)
			addChild(line)
			addChild(line2)
 
		}
		private function mouseDownHandler(e:MouseEvent):void{
			//диспатчим в main
			dispatchEvent(new CommonEvent(CommonEvent.DRAG_WINDOW_DOWN, /*параметр прозрачности окна*/5));
		}
		private function mouseUpHandler(e:MouseEvent):void{
			//диспатчим в main
			dispatchEvent(new CommonEvent(CommonEvent.DRAG_WINDOW_UP, /*параметр прозрачности окна*/1));
		}
		private function mouseDownRemove(e:MouseEvent):void{
			//диспатчим в main
			dispatchEvent(new CommonEvent(CommonEvent.WINDOW_REMOVE, 0));
		}
	}
}

Класс CloseWindow в пакете components

Код AS3:
package components {
 
	import flash.display.Sprite;
	import flash.display.Shape;
 
	public class CloseWindow extends Sprite {
		private var container:Shape;
 
		public function CloseWindow(){
 
			container = new Shape()
			container.graphics.beginFill(0x000000);
				container.graphics.drawRect(80, 0, 20, 20);
			container.graphics.endFill()
			addChild(container)
		}
	}
}
Класс CommonEvent в пакете events

Код AS3:
package events{
 
	import flash.events.Event;
 
	public class CommonEvent extends Event{
 
		private var _t:uint;
 
		//храним имена всех событий
		public static const DRAG_WINDOW_DOWN:String = "drag_window_down";
		public static const DRAG_WINDOW_UP:String = "drag_window_up";
		public static const WINDOW_REMOVE:String = "window_remove";
 
		public function CommonEvent(type:String, /*bubbles:Boolean = false, cancelable:Boolean = false,*/ val:uint) { 
			super(type, /*bubbles, cancelable,*/ true, false);
 
			//параметр прозрачности окна
			_t = val;
		}
 
		public function get t():uint {
			return _t;
		}
	}
}

Исходник принципиально не выложил, попробуйте сперва сами разобраться
Что не ясно спрашивайте.

Старый 12.03.2010, 10:28
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 4  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
KiL33 :это в ту тему?

на русском: http://help.adobe.com/ru_RU/ActionSc...0204-7e4f.html
а вообще в начале освоения AS3 меня жутко смущали наименования target и currentTarget - никак не мог понять почему это "цель" и " текущая цель".
по нормальной логике целью является объект хранящий листенеры или сам листенер.

По нормальной логике именования объект являющийся инициатором события должен называться sender (в AS3==target) - объект от которого получено событие currentSender (currentTarget)
Может быть адобовцы не захотели чтобы их сравнивали с C# итп. может еще что.. я конечно уже всё давно понял и привык, но для новичков бывает сложновато въехать..
Цитата:
Свойство target имеет ссылку на объект, являющийся целью события. В ряде случаев она дается напрямую (например, при активации микрофона целью объекта события становится объект Microphone). Однако если цель находится в списке отображения, необходимо учесть иерархию списка отображения. Например, если пользователь вводит данные о щелчке мыши в тот момент, когда объекты списка отображения перекрываются, Flash Player и AIR всегда выбирают в качестве цели события объект, который находится дальше всего от рабочей области.
хуже не придумаешь.
Какая цель может быть у события? У события как абстрактного объекта может быть только инициатор (sender) и может быть еще корреспондент вещающий события (currentSender) , который часто и есть инициатор, и отличается от него только в случае всплывающих событий. всё..
слушатель(listener) - вот это по сути цель события, но само событие к ним не привязано. слушатель только слушает у корреспондентов события определённого типа. и принимает их в качестве параметра.
__________________
Отряд Котовскага


Последний раз редактировалось Котяра; 12.03.2010 в 11:06.
Старый 12.03.2010, 11:52
KiL33 вне форума Посмотреть профиль Отправить личное сообщение для KiL33 Найти все сообщения от KiL33
  № 5  
Ответить с цитированием
KiL33
 
Аватар для KiL33

Регистрация: Jul 2007
Адрес: Гражданин Российской Федерации
Сообщений: 1,122
Отправить сообщение для KiL33 с помощью ICQ
Cтрелочки, конечно, хорошо, но в коде-то оно нагляднее

Старый 12.03.2010, 16:11
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 6  
Ответить с цитированием
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Насколько я понял, в документе http://help.adobe.com/ru_RU/ActionSc...0204-7e4f.html речь идет о том, как рассылает события рантайм плеера (сам плеер). Тогда все довольно логично: рантайм ловит, допустим, клик, порождает эвент-объект и ставит его в очередь на прокачку от стейджа до целевого узла (чилда) и обратно. Сам целевой узел определяется рантаймом в момент щелчка. Энтерфрейм шлется на прямую. В этом смысле все понятно. target, currentTarget - вполне оправдано употребляются в этом контексте. Почему не все шлется на прямую, а прокачивается очередь - тоже понятно, так проще ловить события в одной веток иерархии отображения. Если целевой объект не входит в иерархию отображения, то ивент шлется ему напрямую, (пример - сокет), что тоже логично.
Если мы добавили листенера на клик по целевому узлу, то вместе с целевым узлом, клик получит и листенер. Это логично делать, если листенер сидит в другой ветке иерархии отображаемых объектов или ниже/на том же уровне в той же ветке. Либо если целевой объект не входит в иерархию отображения вообще. Или я что-то попутал?
Пользовательские события порождаются не рантаймом, а кодом, вот тут, пожалуй о целевом объекте речь идти не может. Пользовательский эвент рассылается по списку листенеров, добавленных к объекту-источнику, в очередь прокачки такой эвент совать ни к чему. Или я опять чего-то попутал?


Последний раз редактировалось alexcon314; 12.03.2010 в 16:28.
Старый 12.03.2010, 17:33
Котяра вне форума Посмотреть профиль Отправить личное сообщение для Котяра Посетить домашнюю страницу Котяра Найти все сообщения от Котяра
  № 7  
Ответить с цитированием
Котяра
буду краток
 
Аватар для Котяра

модератор форума
Регистрация: Sep 2003
Адрес: Ближайшее Замкадье
Сообщений: 3,110
Записей в блоге: 28
Отправить сообщение для Котяра с помощью ICQ Отправить сообщение для Котяра с помощью Skype™
Может быть в механизме реализации событий это и понятно, но по большому счёту пользователю должно быть наплевать как это реализовано в плеере. для него логичнее что: sender - это клип на который нажали и он отослал событие о нажатии на себя..
__________________
Отряд Котовскага

Старый 12.03.2010, 18:59
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 8  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
KiL33, что за классы «СоздатьОкно» и «ЗакрытьОкно»? Давно действие стало классом?

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

Регистрация: Jul 2007
Адрес: Гражданин Российской Федерации
Сообщений: 1,122
Отправить сообщение для KiL33 с помощью ICQ
etc, ты имеешь в виду неправильное именование классов?

ок, пусть CloseWindow будет ButtonClose -- CreateWindow будет NewWindow от этого правда что-то изменится?

Старый 12.03.2010, 22:42
etc вне форума Посмотреть профиль Найти все сообщения от etc
  № 10  
Ответить с цитированием
etc
Et cetera
 
Аватар для etc

Регистрация: Sep 2002
Сообщений: 30,787
Нет, в данном случае нет. Сущность не может иметь название в виде действия или глагола.

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

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

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


 


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


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