|
|
|||||
Регистрация: Mar 2013
Сообщений: 290
|
MovieClip: единый addEventListener
(Можно даже сказать: Единый Слушатель Событий Ада), лол.
Ок, всем привет. Есть мувиклип Area1, в котором находятся три других мувиклипа: Krug1, Krug2, Krug3. Все они залинкованы к одноименным классам через галочку Export to ActionScript. Изначально стэйдж пустой. Класс Main заполняет его вот так: Нужно, чтобы по клику мыши определялось какой кружок был нажат, и шло соответвующее действие. Конешно, это можно сделать повесив на каждый кружок свой слушатель, но так не интересно. Можно ли повесить только один слушатель на объект Area1, чтобы он, через родительские ссылки определял, какой кружок был нажат? Я попытался сделать так: Основной класс: package { import flash.display.Sprite; public class Main extends Sprite { private var area1:Area1; private var eventHandler:EventHandler; public function Main() { area1 = new Area1(); area1.x = 120; area1.y = 150; addChild(area1); eventHandler = new EventHandler(area1); } } } package { import flash.display.MovieClip; import flash.events.*; public class EventHandler extends EventDispatcher { public function EventHandler(mc:MovieClip) { mc.addEventListener(MouseEvent.CLICK, clickHandler); } private function clickHandler(e:Event) { // if (e.currentTarget. ???) // { // trace("Krug1"); // } // else if (e.currentTarget. ???) // { // trace("Krug2"); // } // else if (e.currentTarget. ???) // { // trace("Krug3"); // } } } } Но как это сделать? Вроде бы нужно как-то e.currentTarget. использовать, но не понимаю как именно. Некоторое соображение: Изначально, у объектов на стэйдж нет <Instance names>. Подозреваю что если бы они были, то было бы проще. Тогда наверное прокатило бы что-то вроде: Но хотелось бы решить задачу без привязки к <Imstance name>, если это возможно конешно. |
|
|||||
Регистрация: Mar 2011
Сообщений: 243
|
Используйте #Event.target
|
|
|||||
[+1 05.11.12]
Регистрация: Feb 2011
Сообщений: 431
|
currentTarget выдаст объект на который вы повесили слушатель, в данном случае Area1 (это прямоугольник в котором круги? ) а не круг.
target выдаст непосредственно IEventDispatcher который первым словил событие, если объект состоит из множества фигурок, то e.target будет не мувик Krug1, а какой-нибудь Shape694, и нужно будет проверять какой круг содержит этот шейп. Можно создать класс Круг, там рисовать кружок, ловить и обрабатывать событие, в этом случае E.currentTarget будет именно тот Круг который нужен. Цитата:
__________________
Oomph |
|
|||||
Подписаться на все три клика одним листенером и смотреть event.currentTarget
Добавлено через 1 минуту А вот это слегка вырвиглазое решение.
__________________
Кто к нам с чем для чего - тот у нас того от того. |
|
|||||
Регистрация: Aug 2013
Сообщений: 56
|
Dukobpa3, путаетесь. Смотреть надо target
|
|
|||||
Это вы, товарищ не поняли мой ответ.
Я сказал про три клика. На три объекта. Но листенер один. Добавлено через 1 минуту А про таргет вон выше ответили. Всякие шейпы фильтровать нафиг надо. Таргетом никогда не пользуюсь.
__________________
Кто к нам с чем для чего - тот у нас того от того. |
|
|||||
Регистрация: Aug 2013
Сообщений: 56
|
Dukobpa3, а вон оно что) Ну тогда да currentTarget.
Какой вариант удобнее и лучше зависит от задачи. В данном случае разницы нет. В случае если объектов туева хуча, (н-р интерактивная карта) target будет предпочтительнее. |
|
|||||
В моей практике встречался подобный момент. Некоторые выдержки из кода:
sp2.addChild(mass[it]); // добавляем пазл в спрайт, где размещаются пазлы sp2.addEventListener(MouseEvent.CLICK, toMoving, true); // добавляем прослушиватель спрайту с пазлами
__________________
Мой профиль на фрилансе |
|
|||||
Регистрация: Mar 2013
Сообщений: 290
|
Hauts, нет, так не помогло:
Иф не срабатывает, видимо потому что e.currentTarget = Area1, то есть квадрату-родителю. Спасибо за указание на прием: is Object, я не сообразил что так можно. Deimos747, AlexLucas, Котейка, благодарю за наводку на .target, сделал вот так: if (e.target is Krug1) { trace("Krug1"); } else if (e.target is Krug2) { trace("Krug2"); } else if (e.target is Krug3) { trace("Krug3"); } Или может быть они были бы нужны в каком-то более сложном случае? Например при сильной вложенности, или еще как. Dukobpa3, А почему кстати? Я только недавно изучаю AS3.0, но по совету maincode расширял в данном случае не Sprite, а EventDispatcher. Dukobpa3, Цитата:
SvetozarPNZ, мне просторе решение с target помогло. Про useCapture не в курсе, возможно это нужно в более сложных случаях вложенности объектов? За ссылку спасибо. |
Часовой пояс GMT +4, время: 02:07. |
|
« Предыдущая тема | Следующая тема » |
Теги |
addeventlistener , movieclip , единый слушатель |
|
|