Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Как среда Flash определяет, какой событийный объект создать? (http://www.flasher.ru/forum/showthread.php?t=131763)

TommyLee 27.10.2009 20:02

Как среда Flash определяет, какой событийный объект создать?
 
Во внешней среде (ОС) произошло воздействие на swf: мышкой поводили\щелкнули, кнопку на клавиатуре нажали, когда фокус на swf был, загрузка файла началась\закончилась и т.п. Как среда Flash понимает, какой событийный объект в каком случае создать? ОС передает соответствующее API?

Psycho Tiger 27.10.2009 20:05

Так же, как и браузер.
В целом да, как сказал - так и есть.

TommyLee 27.10.2009 20:45

Тогда следующий вопрос. Про свойства Event, для чего они нужны и почему их такая куча. Среда Flash получает событие от ОС со всеми возможными характеристиками события. Эти всевозможные характеристики пишутся как раз в эти свойства Event?

Добавлено через 1 минуту
Цитата:

Сообщение от Psycho Tiger (Сообщение 861271)
Так же, как и браузер.

Есть, где об этом поподробнее почитать?

Felicast 27.10.2009 21:41

не понял, что вы хотите, но если интересуют события виндоус, можете воспользоваться программкой spy++ (поставляется вместе с Visual Studio). там можно посмотреть, что за события посылает windows всем окнам (включая и флеш, и браузер)
Цитата:

Тогда следующий вопрос. Про свойства Event, для чего они нужны и почему их такая куча.
сколько видов событий, столько и Event. мышинные события в MouseEvent, клавиатурные - в KeyboardEvent. помимо них еще куча всяких событий, можете свои написать.
события нужны чтобы уменьшить связность между классами. например виндовсу абсолютно побарабану, что там должно произойти при клике мышкой. он просто формируем событие клика и передает их браузеру, тот флешу. флеш обрабатывает это событие, находит объект под координатами курсора, и заставляет этот объект сгенерировать событие

TommyLee 28.10.2009 11:22

Цитата:

Сообщение от Felicast (Сообщение 861297)
сколько видов событий, столько и Event. мышинные события в MouseEvent, клавиатурные - в KeyboardEvent. помимо них еще куча всяких событий, можете свои написать.

Посмотрел в справочнике. Так и есть: свойства Event - все возможные характеристики события, получаемые от ОС (у наследников, видимо, также, может плюс что-то для внутренних нужд).

Добавлено через 6 минут
Но это все предопределенные события: какие характеристики (и события) разработчики дали программистам, теми они и могут пользоваться. При разработке ПО, взаимодействующего с аппаратурой, есть ограничения? Например, новый тип манипулятора или диагностическое оборудование? Это все можно повесить на стандартные события?

Котяра 28.10.2009 14:43

это должен отрабатывать сам плеер. например не задействована там левая кнопка - события так и не присылаются ( вернее он перехватывает их и показывает меню, вместо того чтоб передавать событие дальше) Тоже самое про остальные события.. типа файл загружен, нажата кнопка сохранить в диалоговом окне сохранения файла.. итп.

SamFR 28.10.2009 15:30

Цитата:

Сообщение от TommyLee (Сообщение 861391)
При разработке ПО, взаимодействующего с аппаратурой, есть ограничения?

Флеш может ловить только те системные события, обработка которых зашита в плеер.
При разработке ПО, взаимодействующего с нестандартной аппаратурой, лучше использовать не флэш, он не для этого. Можете посмотреть в сторону Qt.

TommyLee 28.10.2009 15:57

ok. Всем спасибо за помощь!

Добавлено через 7 минут
Понял. Всем спасибо за помощь!
Еще вопрос по предопределенным событиям. Среда создает только те событийные объекты, которые указаны в import или автоматически все возможные (имею ввиду предопределенные)?

Felicast 28.10.2009 19:08

флеш получает все события, пришедшие от ОС. каждый DisplayObject генерирует события вне зависимости, есть подписчики или нет. события на то и события, что им абсолютно по барабану, подписаны на них мильен обработчиков или ни одного. они возникают в любом случае

TommyLee 29.10.2009 10:39

Цитата:

Сообщение от Felicast (Сообщение 861604)
флеш получает все события, пришедшие от ОС.

Флеш получает все события, пришедшие от ОС, а дальше должен их куда-то записывать. Я так понял, для этого нужно создать соответствующий событийный объект (MouseEvent и тп). Т.к. во всех примерах (и с игрой, ссылку на которую вы мне писали в другой теме) событийный объект не создается через new, а только импортируется, то вопрос был в следующем: флеш автоматически создает объекты всех событий (клавиатуры, мыши и другие), или только объекты тех событий, которые программист написал через import?

Цитата:

Сообщение от Felicast (Сообщение 861604)
события на то и события, что им абсолютно по барабану, подписаны на них мильен обработчиков или ни одного. они возникают в любом случае

Здесь понятно.

switcher! 29.10.2009 11:40

Цитата:

Сообщение от TommyLee (Сообщение 861739)
флеш автоматически создает объекты всех событий (клавиатуры, мыши и другие), или только объекты тех событий, которые программист написал через import?

если в коде, где используется класс события, вы не импортируете этот самый класс события - приложение просто не откомпилируется.

TommyLee 29.10.2009 12:32

Значит, событийные объекты создаются средой флеш. Ясно, меньше ошибок программиста. На каждое событие только один экземпляр событийного объекта?

switcher! 29.10.2009 13:20

читаем

alexcon314 29.10.2009 13:35

Объект флэш-события создается, видимо, если есть хоть один его слушатель, иначе какой в нем смысл? На этапе компиляции в ролик встраивается код, позволяющий этих слушателей создавать. А импорты просто указывают, что это будет за код.
Цитата:

На каждое событие только один экземпляр событийного объекта?
А какой смысл их множить? Передаем уазатель на объект и все.

TommyLee 29.10.2009 13:41

Цитата:

Сообщение от alexcon314 (Сообщение 861807)
Объект флэш-события создается, видимо, если есть хоть один его слушатель, иначе какой в нем смысл?

Цитата:

Сообщение от Felicast (Сообщение 861604)
события на то и события, что им абсолютно по барабану, подписаны на них мильен обработчиков или ни одного. они возникают в любом случае

Я так понял: если усть импорт события, то среда его создаст.

Добавлено через 34 секунды
Цитата:

Сообщение от switcher! (Сообщение 861796)

Спасибо за ссылку, интересно.

wvxvw 29.10.2009 13:48

Цитата:

Сообщение от TommyLee (Сообщение 861779)
Значит, событийные объекты создаются средой флеш. Ясно, меньше ошибок программиста. На каждое событие только один экземпляр событийного объекта?

Нет, каждое событие - уникальный объект с примерно такой логикой:
- склонировали объект события.
- записали в него новые target, currentTarget, отдали слушателю.
- если слушатель "остановил" событие, прекращаем его раздавать остальным слушателям.
(В случае с всплывающими событиями, событие можно остановить отдельно, чтобы не всплывало дальше и отдельно, чтобы слушатели того же уровня его не получили).

Да, но с другой стороны, если вам эта реализация кажется избыточной (мне иногда она кажется избыточной :) ) То никто не мешает переопределить методы типа dispatchEvent() и раздавать не клонированое событие, а один и тот же объект, ну или вообще забить на события и просто вызывать функцую слушателя, если в событиях как таковых нет необходимости.

alexcon314 29.10.2009 13:48

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

TommyLee 29.10.2009 15:52

Цитата:

Сообщение от wvxvw (Сообщение 861821)
Нет, каждое событие - уникальный объект с примерно такой логикой:
.........

То есть, например, на каждый клик создается свой событийный объект? Нет такого: среда создала событийный объект; произошел щелчок мыши - среда поместила его в этот объект; кто на него подписан - получил и обработал; дальше опять щелчок - среда поместила это событие в тот же объект (перезаписала) и так по новой.. Получается, ваш вариант с переопределением EventDispatcher.

Цитата:

Сообщение от alexcon314 (Сообщение 861822)
В вашей терминологии "импорт события" это импорт класса, создающего слушателя данного события.

Я пока путаюсь в терминологии, т.к. у перевода Мука и в руководстве она разная, к тому же не уверен, что правильно понял событийную модель. Я имел вот что: например, import MouseEvent. Теперь, если среда флеш получит мышиное событие, она создаст экземпляр класса MouseEvent. Который, в свою очередь, пойдет всем подписчикам.

Felicast 29.10.2009 19:52

флеш получит мышинное событие в любом случае. в сотый раз говорю: ему абсолютно плевать, слушает кто его или нет. и даспатчЕвент сработает. просто если подписчиков нет, то никуда это событие и не пойдет.
насчет import MouseEvent: это тоже ни на что не влияет. эта строчка нужна для того чтобы вы в коде могли использовать класс MouseEvent (к слову сказать, этот класс нативный (находится в самом плеере)

зы: вчитываясь с комменты, создается такое впечатление, что каждый говорит о своем


UPD: даже не пожалел времени набросал как примерно работает EventDispatcher (реализация может и не такая, но идея должна быть понятна)
Код AS3:

public class EventDispatcher
{
        private var _events:Dictionary;
        public function EventDispatcher()
        {
                _events = new Dictionary();
        }
        public function addEventListener(eventType:String, eventHandler:Function):void
        {
                var eventsList:Array = _events[eventType];
                if (!eventsList)
                {
                        eventsList = new Array();
                        _events[eventType] = eventsList;
                }
                eventsList.push(eventHandler);
        }
        public function dispatchEvent(event:Event):void
        {
                var eventsList:Array = _events[eventType];
                if (eventsList)
                {
                        for each (var handler:Function in eventsList)
                        {
                                handler(event);
                        }
                }
        }
}


SamFR 29.10.2009 19:59

Цитата:

Сообщение от TommyLee (Сообщение 861903)
Я имел вот что: например, import MouseEvent. Теперь, если среда флеш получит мышиное событие, она создаст экземпляр класса MouseEvent. Который, в свою очередь, пойдет всем подписчикам.

Нет, import просто указывает компилятору, что данный класс используется в коде и позволяет получить к нему доступ без указания пакета. Можно обойтись и без импорта, но в этом случае всё время придётся вместо MouseEvent писать flash.events.MouseEvent.

Диспетчер (в том числе то, что вы называете "среда") рассылает события всем подписчикам, вне звависимости от того, произведён ли в их коде импорт соответствующего класса. А то, на какое событие слушатель подписан, определяется не классом события, а строкой, которая была передана в качестве параметра type метода addEventListener (и доступна через Event.type).

Например, мы можем подписаться на MouseEvent.MOUSE_DOWN, а параметр метода-слушателя объявить как e:Event. И события будут приходить всё равно, более того, не возникнет никаких ошибок (так как MouseEvent наследует Event). Мы просто не сможем получить доступ к свойствам и методам, определённым непосредственно в MouseEvent (localX, например).

Felicast 29.10.2009 20:04

Цитата:

Мы просто не сможем получить доступ к свойствам и методам, определённым непосредственно в MouseEvent (localX, например)
ну почему не сможем. к нам придет то ведь все-равно MouseEvent, что мешает нам кастануть наш евент

SamFR 29.10.2009 20:06

Естественно, просто я именно хотел обратить внимание на то, в чём разница между типом и классом события.

TommyLee 30.10.2009 12:01

Цитата:

Сообщение от Felicast (Сообщение 861982)
в сотый раз говорю: ему абсолютно плевать, слушает кто его или нет.

Это я уже понял. Спасибо за пример реализации EventDispatcher.

Цитата:

Сообщение от Felicast (Сообщение 861982)
класс MouseEvent (к слову сказать, этот класс нативный (находится в самом плеере)

Получается, все предопределенные события - нативные, т.е. в коде можно их не создавать, как пользовательские объекты.
Далее:
- При возникновении однотипного события несколько раз, создается соответствующее количество объектов: например, щелкнул 3 раза - флеш создал 3 объекта события MouseEvent;
- импорт предопределенных событий. Только для удобства записи в коде.

Цитата:

Сообщение от SamFR (Сообщение 861983)
Диспетчер (в том числе то, что вы называете "среда")

То есть, когда я говорил о среде флеш, я говорил об объекте класса EventDispatcher?

SamFR 30.10.2009 12:17

Да, всё верно. Среда содержит в себе определённое количество нативных наследников EventDispatcher – диспетчеров событий. Эти события вручную создавать, как правило, нет необходимости, они создаются плеером.

Хотя никто вам этого делать не мешает: например, можно сгенерить в каком-нибудь DisplayObject-е событие MouseEvent.MOUSE_DOWN, и все подписчики будут думать, что в этом объекте был произведён щелчок мышью.

switcher! 30.10.2009 12:57

Цитата:

Сообщение от SamFR (Сообщение 861983)
Нет, import просто указывает компилятору, что данный класс используется в коде и позволяет получить к нему доступ без указания пакета. Можно обойтись и без импорта, но в этом случае всё время придётся вместо MouseEvent писать flash.events.MouseEvent.

Цитата:

Сообщение от TommyLee (Сообщение 862094)
- импорт предопределенных событий. Только для удобства записи в коде.

вот пример:
Код AS3:

package
{
        import flash.display.Sprite;
 
        public class Example extends Sprite {
                private var i:int;
 
                function Example():void {
                        var s:Sprite = new Sprite();
                        s.graphics.beginFill(0);
                        s.graphics.drawCircle(40, 40, 30);
                        s.addEventListener(flash.display.MouseEvent.CLICK, func3);
 
                        addChild(s);
                }
 
                private function func3(e:flash.display.MouseEvent):void {
                        trace(3);
                }
    }
}

не откомпилируется
и при этом да - MouseEvent зашит в плеер.

etc 30.10.2009 13:01

Цитата:

Сообщение от SamFR (Сообщение 861983)
Нет, import просто указывает компилятору, что данный класс используется в коде и позволяет получить к нему доступ без указания пакета. Можно обойтись и без импорта, но в этом случае всё время придётся вместо MouseEvent писать flash.events.MouseEvent.

Это в AS2 так можно было.

SamFR 30.10.2009 13:02

Не flash.display.MouseEvent, а flash.events.MouseEvent. Обратите внимание.

Добавлено через 4 минуты
Цитата:

Сообщение от etc (Сообщение 862108)
Это в AS2 так можно было.

Да, точно. Интересно, что же тогда импорт ещё делает в случае нативных классов, кроме расширения области видимости?

TommyLee 30.10.2009 13:08

Цитата:

Сообщение от etc (Сообщение 862108)
Это в AS2 так можно было.

Я что-то не правильно понял?

SamFR 30.10.2009 13:10

Цитата:

Сообщение от TommyLee (Сообщение 862111)
Я что-то не правильно понял?

Как оказывается, в AS3 импорт обязателен, просто указать пакет недостаточно.

switcher! 30.10.2009 13:22

Цитата:

Сообщение от SamFR (Сообщение 862109)
Не flash.display.MouseEvent, а flash.events.MouseEvent

пардон, опечатался, но не точности пути была суть, собственно )))

P.S. почитайте этот топик.

SamFR 30.10.2009 13:37

Цитата:

Сообщение от switcher! (Сообщение 862115)
пардон, опечатался, но не точности пути была суть, собственно )))

Я просто вначале подумал, что из-за этого не компилится. А получается действительно интересная вещь =)

Цитата:

Сообщение от switcher! (Сообщение 862115)
P.S. почитайте этот топик.

Спасибо, познавательно.

TommyLee 30.10.2009 13:43

Получается, даже для нативного класса необходимо выполнить импорт. А нативность дает только то, что в коде можно не создавать объекты такого класса, это делает флеш?

з.ы. не считая скорости работы объектов нативных классов.

SamFR 30.10.2009 13:54

Цитата:

Сообщение от TommyLee (Сообщение 862123)
А нативность дает только то, что в коде можно не создавать объекты такого класса, это делает флеш?

Если бы среда не рассылала нативные события, толку от их создания всё равно не было бы никакого – мы бы, например, никак не смогли узнать, что была нажата кнопка мыши. Ведь мы не можем на AS написать обработчик системного сообщения. Даже под AIR.

TommyLee 30.10.2009 15:54

С пользовательскими событиями вручную - флеш сам не создает их объекты?

Добавлено через 8 минут
Или если свой класс-события - наследник от нативного Event, то флеш все равно сам создает событийные объекты?

Felicast 30.10.2009 17:11

так разберемся:
чтобы сгенерировать событие нужно вызвать метод dispatcheEvent, куда передать наше событие.
при клике флеш сам вызывает метод dispatcheEvent у необходимого объекта с необходимым событием.
никто не мешает вам самому вызвать событие клика. для этого нужно просто создать экземпляр MouseEvent с типом "click". и вызвать метод dispatcheEvent

TommyLee 31.10.2009 14:36

Всем спасибо за прояснение некоторых нюансов. Оказалось, не до конца понимаю архитектуру событийной модели. Но это уже уже к теме не относится.


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

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