Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   MovieClip: единый addEventListener (http://www.flasher.ru/forum/showthread.php?t=202841)

Fogflasher 14.08.2013 17:55

MovieClip: единый addEventListener
 
Вложений: 1
(Можно даже сказать: Единый Слушатель Событий Ада), лол.

Ок, всем привет.

Есть мувиклип Area1, в котором находятся три других мувиклипа: Krug1, Krug2, Krug3.
Все они залинкованы к одноименным классам через галочку Export to ActionScript.

Изначально стэйдж пустой. Класс Main заполняет его вот так:

Вложение 29909

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

Можно ли повесить только один слушатель на объект Area1, чтобы он, через родительские ссылки определял, какой кружок был нажат?

Я попытался сделать так:

Основной класс:
Код AS3:

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);
 
                }
        }
 
}

Класс EventHandler:

Код AS3:

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>.
Подозреваю что если бы они были, то было бы проще.
Тогда наверное прокатило бы что-то вроде:
Код AS3:

e.currentTarget.Area1_Instancename.Krug1_instancename

Но хотелось бы решить задачу без привязки к <Imstance name>, если это возможно конешно.

Hauts 14.08.2013 18:16

Код AS3:

if(e.currentTarget is Krug1){...}

Так поможет?

Deimos747 14.08.2013 20:13

Используйте #Event.target

AlexLucas 14.08.2013 20:59

currentTarget выдаст объект на который вы повесили слушатель, в данном случае Area1 (это прямоугольник в котором круги? ) а не круг.
target выдаст непосредственно IEventDispatcher который первым словил событие, если объект состоит из множества фигурок, то e.target будет не мувик Krug1, а какой-нибудь Shape694, и нужно будет проверять какой круг содержит этот шейп.
Можно создать класс Круг, там рисовать кружок, ловить и обрабатывать событие, в этом случае E.currentTarget будет именно тот Круг который нужен.

Цитата:

Изначально, у объектов на стэйдж нет <Instance names>.
Если объекту явно имя не задано, задаётся шаблонное имя (ИмяКласса672 например, цифра как-то вычисляется непонятно).

Dukobpa3 14.08.2013 21:15

Подписаться на все три клика одним листенером и смотреть event.currentTarget

Добавлено через 1 минуту
Цитата:

Код AS3:

class EventHandler extends EventDispatcher


А вот это слегка вырвиглазое решение.

Котейка 14.08.2013 23:42

Dukobpa3, путаетесь. Смотреть надо target :)

Dukobpa3 14.08.2013 23:45

Это вы, товарищ не поняли мой ответ.
Я сказал про три клика. На три объекта. Но листенер один.

Добавлено через 1 минуту
А про таргет вон выше ответили. Всякие шейпы фильтровать нафиг надо. Таргетом никогда не пользуюсь.

Котейка 14.08.2013 23:57

Dukobpa3, а вон оно что) Ну тогда да currentTarget.
Какой вариант удобнее и лучше зависит от задачи. В данном случае разницы нет.
В случае если объектов туева хуча, (н-р интерактивная карта) target будет предпочтительнее. :)

SvetozarPNZ 15.08.2013 09:57

В моей практике встречался подобный момент. Некоторые выдержки из кода:

Код AS3:

sp2.addChild(mass[it]);        // добавляем пазл в спрайт, где размещаются пазлы
sp2.addEventListener(MouseEvent.CLICK, toMoving, true); // добавляем прослушиватель спрайту с пазлами

Код AS3:

                public function toMoving(e):void {                        
                        var evDisp = e.target; // это экземпляр класса пазл
                        }
                }

Похоже ваша цель заключается в использовании параметра useCapture метода addEventListener Если не знакомы, то разбирайте фазы в потоке событий

Fogflasher 15.08.2013 11:24

Hauts, нет, так не помогло:
Код AS3:

                        if (e.currentTarget is Krug1)
                        {
                                trace("Krug1");
                        }

Иф не срабатывает, видимо потому что e.currentTarget = Area1, то есть квадрату-родителю.
Спасибо за указание на прием: is Object, я не сообразил что так можно.

Deimos747, AlexLucas, Котейка, благодарю за наводку на .target, сделал вот так:

Код AS3:

 
                        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:

А вот это слегка вырвиглазое решение.

А почему кстати? Я только недавно изучаю AS3.0, но по совету maincode расширял в данном случае не Sprite, а EventDispatcher.

Dukobpa3,
Цитата:

Подписаться на все три клика одним листенером и смотреть event.currentTarget
Не совсем понимаю, что вы имеете ввиду? То есть на каждый кружок повесить addEventListener, но который ссылается на единый обработчик?

SvetozarPNZ, мне просторе решение с target помогло.
Про useCapture не в курсе, возможно это нужно в более сложных случаях вложенности объектов? За ссылку спасибо.


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

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