|
|
« Предыдущая тема | Следующая тема » |
Опции темы | Опции просмотра |
|
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Как передаются события по иерархической цепочке
Продолжая тему и забыв о том, что я писал, начну заново. Есть Main, в нем лежит спрайт container, в котором лежит спрайт button. На клик подписан контейнер. И вот вызывается клик и первым об этом узнает сцена.
Она смотрит свой список чилдов и видит в нем Main. Сцена уведомляет его, а тот в свою очередь смотрит свой список чилдов и найдя контейнер, уведомляет его. И в контейнере срабатывает слушатель... И сразу много вопросов - уведомляет, это передает объект типа MouseEvent? После срабатывания слушателя в контейнере, событие передается дальше и если его не прервать, то о нем и кнопка узнает? Если это правильно, то откуда в слушателе берётся currentTarget, как он вообще туда попадает? |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
currentTarget это объект, которому добавили слушатель.
target это объект, получивший событие (в случа ДО от стейджа через своих родителей), и отправивший его всплывать обратно. То есть "конечный" получатель события, глубже которого уже нет. Добавлено через 1 минуту Цитата:
Добавлено через 17 минут В Вашем случае контейнер будет currentTarget ("На клик подписан контейнер"). Кнопка будет target, но только если ее собственные внутренности не реагируют на мышь. Клик сначала "тонет", стейдж - мейн - контейнер - буттон. Дальше тонуть некуда, нет объектов с реакцией на мышь. Поэтому буттон называется "получатель" события, таргет. Буттон записывает себя в поле target копии события и отправляет его наверх. От него событие начинает "всплывать". И в этой фазе (по-умолчанию) оно и ловится. В Вашем случае всплывает до контейнера, и на это событие в фазе всплытия у контейнера зарегистрирован слушатель. Он стало быть срабатывает, контейнер (его внутренний EventDispatcher) вызывает функцию-обработчик и передает ей копию объекта MouseEvent, без ложной скромности записав в currentTarget ссылку на себя, любимого. В мейн и стейдж оно тоже всплывет, естественно. Если не прекратить пропаганду.
__________________
Reality.getBounds(this); |
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Wolsh Спасибо! Сейчас читаю сопоставляю Ваши слова с хелпом и понимаю, что это уже знаю, но просто подзабыл. И ещё выявил ошибку в знаниях, я думал что третий параметр, это событие всплытия, т.е. когда f получать события в фазе всплытия. А оказывается всё наоборот.
Но хочу ещё уточнить - в контейнере лежат пять кнопок, при клике по контейнеру я событие проходит по всем пяти кнопкам? Но если да, то почему target та, которая была под курсором?) |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
В каком смысле "событие проходит по всем пяти кнопкам"? Что за балаган? У Вас пять курсоров по экрану мышка гоняет? Интерактивные события это не ентерфрейм! Они не многоадресные, они иерархичны, и у них есть такая маленькая штучка как координаты пойнтера.
__________________
Reality.getBounds(this); |
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Цитата:
Или если у Main будет много детей, их это событие обойдет? Цитата:
|
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Вам когда-нибудь приходило в голову, что, возможно, flashplayer и его дисплейные объекты, как и реализация событий, написаны не совсем на ActionScript 3.0? Что если Вы, сидя в машине, смотрите на стрелку и шкалу, чтобы узнать остаток топлива, это вовсе не значит, что внутри машины спряталась очередь из 15 корейских карликов, каждый из которых смотрит на свою стрелку и шкалу и поворачивает стрелку для другого, чтобы передать Вам свежие данные? Не надо думать, что getObjectsUnderPoint(), например, содержит в себе написанный на AS3 цикл перебора всех детей с рекурсией и применением к каждому AS3 же метода hitTestPoint(), а рендер флэшплеера делает снимок стейджа в битмапдату методом draw() и результат отдает видеокарте.. предварительно собирая ByteArray с помощью getPixel32().. Что за наивность? Задумайтесь: флэшплееровский рендер способен за миллиардную долю секунды вычислить, каким будет окончательный цвет конкретного пикселя для вывода на экран с учетом тысячи наложений объектов с разным цветом, альфой, блендингом и трансформациями — поворотами и масштабированием. С помощью классов AS3 вам вряд ли удастся измерить, с какой скоростью он определяет цепочку объектов под указателем мыши.
__________________
Reality.getBounds(this); Последний раз редактировалось Wolsh; 25.02.2014 в 09:23. |
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Приходило, но для уверенности необходимо было уточнить. Спасибо! Вроде разобрался окончательно.
Но иногда мне кажется, что там карлики сидят, правда я думал что китайские |
|
|||||
Цитата:
|
|
|||||
и закопаны
|
Часовой пояс GMT +4, время: 02:39. |
|
« Предыдущая тема | Следующая тема » |
|
|