![]() |
MovieClip: единый addEventListener
Вложений: 1
(Можно даже сказать: Единый Слушатель Событий Ада), лол.
Ок, всем привет. Есть мувиклип Area1, в котором находятся три других мувиклипа: Krug1, Krug2, Krug3. Все они залинкованы к одноименным классам через галочку Export to ActionScript. Изначально стэйдж пустой. Класс Main заполняет его вот так: Вложение 29909 Нужно, чтобы по клику мыши определялось какой кружок был нажат, и шло соответвующее действие. Конешно, это можно сделать повесив на каждый кружок свой слушатель, но так не интересно. Можно ли повесить только один слушатель на объект Area1, чтобы он, через родительские ссылки определял, какой кружок был нажат? Я попытался сделать так: Основной класс: Код AS3:
Код AS3:
Но как это сделать? Вроде бы нужно как-то e.currentTarget. использовать, но не понимаю как именно. Некоторое соображение: Изначально, у объектов на стэйдж нет <Instance names>. Подозреваю что если бы они были, то было бы проще. Тогда наверное прокатило бы что-то вроде: Код AS3:
|
Код AS3:
|
Используйте #Event.target
|
currentTarget выдаст объект на который вы повесили слушатель, в данном случае Area1 (это прямоугольник в котором круги? ) а не круг.
target выдаст непосредственно IEventDispatcher который первым словил событие, если объект состоит из множества фигурок, то e.target будет не мувик Krug1, а какой-нибудь Shape694, и нужно будет проверять какой круг содержит этот шейп. Можно создать класс Круг, там рисовать кружок, ловить и обрабатывать событие, в этом случае E.currentTarget будет именно тот Круг который нужен. Цитата:
|
Подписаться на все три клика одним листенером и смотреть event.currentTarget
Добавлено через 1 минуту Цитата:
|
Dukobpa3, путаетесь. Смотреть надо target :)
|
Это вы, товарищ не поняли мой ответ.
Я сказал про три клика. На три объекта. Но листенер один. Добавлено через 1 минуту А про таргет вон выше ответили. Всякие шейпы фильтровать нафиг надо. Таргетом никогда не пользуюсь. |
Dukobpa3, а вон оно что) Ну тогда да currentTarget.
Какой вариант удобнее и лучше зависит от задачи. В данном случае разницы нет. В случае если объектов туева хуча, (н-р интерактивная карта) target будет предпочтительнее. :) |
В моей практике встречался подобный момент. Некоторые выдержки из кода:
Код AS3:
Код AS3:
|
Hauts, нет, так не помогло:
Код AS3:
Спасибо за указание на прием: is Object, я не сообразил что так можно. Deimos747, AlexLucas, Котейка, благодарю за наводку на .target, сделал вот так: Код AS3:
Или может быть они были бы нужны в каком-то более сложном случае? Например при сильной вложенности, или еще как. Dukobpa3, Код AS3:
Dukobpa3, Цитата:
SvetozarPNZ, мне просторе решение с target помогло. Про useCapture не в курсе, возможно это нужно в более сложных случаях вложенности объектов? За ссылку спасибо. |
Цитата:
Цитата:
Если вешать слушатель на каждую кнопку в том элементе, где вы создаете кнопки, то .currentTarget покажет на конкретную кнопку. В данном случае все таки лучше унаследоваться от Sprite чтобы не заморачиваться с двумя проблемами одновременно. Код AS3:
|
Цитата:
Цитата:
|
KumoKairo, ваш пример несколько проще: у кнопок нет родительского объекта.
Если этот общий код попробовать реализовать применительно к моему примеру, то получается например так: Код AS3:
Я пробовал заменить строки вот так: Код AS3:
Цитата:
Вариант более оптимального кода - вынести обработчик в отдельный класс. |
В первом примере переменные krug1 и т.д. никакого отношения к кнопкам в area1 не имеют) Во втором случае ошибка из-за того, что переменные krug1 и т.д. private (скорее всего) и их не видно вне area1.
|
KumoKairo, но тогда я что-то общую картинку не сложу до конца.
Цитата:
И как же тогда обратится к этому ребёнку, если нет никакого отношения? Цитата:
Код AS3:
|
Покажите код Area1
Я не помню точно насчет нативных событий на флеш, но там можно определять, всплывает ли оно пузырьком по своим родителям или нет. |
Или я не вник особо, или у вас тут каша какая-то.
Вы что же это, рекомендуете вешать один слушатель на контейнер с кружочками и определять кружок по currentTarget? |
KumoKairo, У него нет кода, это тупо квадрат (содержащий внутри кружки) созданный вручную в редакторе.
У него имя класса, как и у кружков, сделано посредством галочки Export to ActionScript. Zebestov, ну вот выше в трэде мы выяснили что задачу легко решить через .target А если попробовать сделать то же самое с currentTarget, то возникает вопрос, как это разрулить, с учетом того, что родительский объект содержит в себе объекты, на которых слушатели повешены. |
Я бы повесил всё таки один addEventListener на общий контейнер. А для кругов установил свойство
Код AS3:
|
Цитата:
Цитата:
Добавлено через 2 минуты Цитата:
Нужно как раз наоборот Код AS3:
|
Цитата:
Это была попытка решить задачу по другому, мне достаточно .target-версии, другой вариант интересен чисто теоретически. Насчет свойств, спасибо за наводку. В хэлпе написано: Цитата:
Цитата:
Для target-версии эти свойства для кругов не нужны, и так всё работает. Но если все-таки повесить свойства на area1, то работает только вариант: Код AS3:
Для currentTarget-версии, попробовал такие комбинации: Код AS3:
Значит Zebestov прав, currentTarget-версия какбэ невозможна : ) |
| Часовой пояс GMT +4, время: 16:09. |
Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.