Форум 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

Цитата:

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

Aquahawk 01.12.2010 14:59

alexcon314 я сейчас на работе, вечером домой приду, найду и скину.

Добавлено через 7 часов 35 минут
alexcon314 Собственно вот: Гражданский Кодекс РФ статья 1280 (http://www.gk-rf.ru/statia1280) Особенно интересен пункт 3.
Цитата:

3. Лицо, правомерно владеющее экземпляром программы для ЭВМ, вправе без согласия правообладателя и без выплаты дополнительного вознаграждения воспроизвести и преобразовать объектный код в исходный текст (декомпилировать программу для ЭВМ) или поручить иным лицам осуществить эти действия, если они необходимы для достижения способности к взаимодействию независимо разработанной этим лицом программы для ЭВМ с другими программами, которые могут взаимодействовать с декомпилируемой программой, при соблюдении следующих условий:
1) информация, необходимая для достижения способности к взаимодействию, ранее не была доступна этому лицу из других источников;
2) указанные действия осуществляются в отношении только тех частей декомпилируемой программы для ЭВМ, которые необходимы для достижения способности к взаимодействию;
3) информация, полученная в результате декомпилирования, может использоваться лишь для достижения способности к взаимодействию независимо разработанной программы для ЭВМ с другими программами, не может передаваться иным лицам, за исключением случаев, когда это необходимо для достижения способности к взаимодействию независимо разработанной программы для ЭВМ с другими программами, а также не может использоваться для разработки программы для ЭВМ, по своему виду существенно схожей с декомпилируемой программой для ЭВМ, или для осуществления другого действия, нарушающего исключительное право на программу для ЭВМ.
Кстати это даёт право дизассеблировать демо версии, т.к. мы им владеем правомерно, т.к. владелец их раздаёт.


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

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