Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Можно ли подписаться на все события? (http://www.flasher.ru/forum/showthread.php?t=147291)

Aquahawk 01.12.2010 11:26

Можно ли подписаться на все события?
 
Есть некий класс, наследован, допустим, от спрайта. Мы его добавляем на стейдж, убираем, что-то с ним делаем. Можно ли для этого класса подписаться на все события сразу? Нужно для того чтоб из все сохранить а потом в определённый момент передиспатчить(с этим проблем нет). Можно конечно сделать много копипаста и подписаться на каждый тип события по отдельности. Также можно гарантировать что никаких пользовательских событий не диспатчится и все события что могут ходить описаны в Event.* Опять же знаю что в нормальном коде такое недопустимо, используется в академических и очень специфических целях.

bav 01.12.2010 11:40

Цитата:

Опять же знаю что в нормальном коде такое недопустимо
По-моему в этой строчке содержится ответ на вопрос. Если бы подобное было бы допустимо, а главное часто необходимо, думаю, адобовцы создали бы для этого отдельную функцию. А раз острой необходимости в этом нет, при возникновении академического интереса, полагаю, приходится создавать надуманные ситуации и писать много однотипного кода.
---
P.S. В Google я не ходил, могу оказаться неправ.

mikhailk 01.12.2010 11:54

Я не знаю, зачем это нужно, но ответ очевиден - надо не подписываться на все события, а подписаться на одно событие (напр. Main.SUPER_EVENT), а все события в приложении свести к этому событию. Примерно так:

Код AS3:

private function onSuperEventIncoming(e:Event) : void
{
  var eventType:String = e.target.eventType; // это и есть реальное событие
}

Соответственно, все объекты в приложении старательно по любому поводу диспатчат одно и то же событие Main.SUPER_EVENT, указывая в собственной паблик переменной eventType, что за событие они имеют в виду.

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

-De- 01.12.2010 12:14

Перегрузить addEventListener у этого класса может просто? И записывать кто на что подписал его.

Aquahawk 01.12.2010 12:48

Цитата:

Сообщение от mikhailk (Сообщение 953879)
Я не знаю, зачем это нужно, но ответ очевиден - надо не подписываться на все события, а подписаться на одно событие (напр. Main.SUPER_EVENT), а все события в приложении свести к этому событию. Примерно так:

Код AS3:

private function onSuperEventIncoming(e:Event) : void
{
  var eventType:String = e.target.eventType; // это и есть реальное событие
}

Соответственно, все объекты в приложении старательно по любому поводу диспатчат одно и то же событие Main.SUPER_EVENT, указывая в собственной паблик переменной eventType, что за событие они имеют в виду.

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

Вы наверно неправильно поняли. Ни один объект в коде сам не диспатчит ивентов, мне надо словить всякие Event.ADDED_TO_STAGE и прочие, те что генерирует сам флешплеер.

Цитата:

Сообщение от -De- (Сообщение 953886)
Перегрузить addEventListener у этого класса может просто? И записывать кто на что подписал его.

тоже видимо неправильно поняли. Мне надо в конструкторе этого класса самому подписаться на всё что можно.

Разъясню немного подробнее. Был класс и был у него конструктор, там он подписывался на всякие события, я не знаю какие. Мне надо сделать конструктор пустым и его код переместить в другой метод, который я позже вызову сам и объект инициализируется с запозданием. Проблема в том что если он в конструкторе подписался на Event.ADDED_TO_STAGE, то если я это перенесу в метод, который вызову после добавления на стейдж, то это событие уже не придёт, а мне надо его ему отправить. Руками если я сам ловлю и отправляю потом, после инициализации, то всё работает. Только хотелось бы лаконично всё за него получить а потом ему же всё и отправить.

goodguy 01.12.2010 14:05

Не понятно что там конкретно куда добавляется, но очевидно, что перехват всех событий - не лучший способ решения подобной задачи.

Aquahawk, а если всё-таки избежать таких формулировок:
Цитата:

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

Aquahawk 01.12.2010 14:09

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

-De- 01.12.2010 14:18

И всё, поди, без пошлины? (с)

Aquahawk 01.12.2010 14:33

-De- по Российским законам реверс-инжиниринг и дизассемблинг разрешёны для обеспечения совместимости с разрабатываемым тобой продуктом, что я и делаю, так что всё нормально и вполне официально. Да и пока я правлю собой же написанные тесткейсы.

alexcon314 01.12.2010 14:58

Цитата:

по Российским законам реверс-инжиниринг и дизассемблинг разрешёны для обеспечения совместимости с разрабатываемым тобой продуктом
Ссылку на информацию по данному вопросу не дадите? В идеале, ссылку на закон, где это прописано.


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

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