Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Не могу получить элемент из слушателя eventListener (http://www.flasher.ru/forum/showthread.php?t=144191)

Alex Burn 06.09.2010 01:06

Не могу получить элемент из слушателя eventListener
 
В чем ошибка?
Код AS3:

var ListMenu:Array=new Array(set_mc,guard_mc,card_mc,acces_mc,tables_mc,cases_mc,shuffles_mc,cloth_mc);
 
 
 
                        for(var i:int = 0; i<ListMenu[i].length; i++){
                                ListMenu[i].id = i;
                                ListMenu[i].addEventListener(MouseEvent.MOUSE_OVER, MenuOver);
                                ListMenu[i].addEventListener(MouseEvent.MOUSE_OUT, MenuOut);
                        }
 
                function MenuOver(e:MouseEvent):void{
 
                                trace(e.target);
 
                        }
                function MenuOut(e:MouseEvent):void{
 
                        }


RandomUser 06.09.2010 01:08

Код AS3:

for(var i:int = 0; i<ListMenu.length; i++)


Alex Burn 06.09.2010 01:10

Спасибо ;)

PHILOSOFF 06.09.2010 01:18

И на всякий случай... Чтобы узнать id клипа:

Код AS3:

function MenuOver(e:MouseEvent):void{
                                trace(e.target.id);
}


in4core 06.09.2010 01:32

угу а еще надо в классе расширить этот id )))

nOobCrafter 06.09.2010 11:45

in4core если там мувиклип то можно и не расширять, это динамический класс.

in4core 06.09.2010 14:03

попробуй ) не расширять если мувиклип ) посмотрим как не ругнется компила

Tr1te 06.09.2010 14:28

У меня не разу не получалось получить переменную через event.target.

То есть создаю Main класс, в нем создаю экземпляр класса в который передаю параметр ID, а он в экземпляре прописан как public var. И в нем же есть слушатель, который по нажатию мышки, диспетчит родителю (Main'у). В мейне я ловлю это событие и вызываю:
Код AS3:

event.target.ID

. На что мне выдает ошибку что такой переменной у данного класса не существует.

Что логично, ибо когда я вызываю
Код AS3:

event.target

, он мне выдает [Main], у которого естественно нет ID и который конечно же является таргетом.

А как мне через таргет вызвать именно переменную экземпляра?

nOobCrafter 06.09.2010 15:10

Tr1te e.currentTarget? как повешен слушатель?
in4core
Код AS3:

var mc:MovieClip = new MovieClip();
        mc.id = 100-500;
        trace(mc.id);


Zik. 06.09.2010 15:10

Цитата:

Сообщение от in4core (Сообщение 933780)
попробуй ) не расширять если мувиклип ) посмотрим как не ругнется компила

Если по секрету, то мувиклип в самом деле динамический класс и компилятор не ругнется если обратиться к id, проблема в том, что практика плохая это

etc 06.09.2010 16:31

Непонятно, зачем 100500 раз повторять ListMenu[i] в коде и подписываться у каждого мувика на OVER/OUT, когда можно было это сделать один раз.

nOobCrafter 06.09.2010 16:44

etc это о чем речь?

etc 06.09.2010 16:50

О коде в первом посте.

nOobCrafter 06.09.2010 17:05

ну я понял что о нем, о какой альтернативе идет речь? Как можно
Цитата:

когда можно было это сделать один раз.
подписать сразу контейнер чтоли?

etc 06.09.2010 17:07

Ну да, прям у контейнера.

nOobCrafter 06.09.2010 17:26

ок, мы повесили, а как теперь достучаться до ребенка этого контейнера на который навели? Если уучесть что зачастую эти дети не пусты то e.target - может быть не только ребенок, а вообще что угодно на что навели, спрайт какой нить или еще чего нить, а e.currentTarget будет непосредственно сам контейнер. как тут быть?
Код AS3:

                        _videoCont = new Sprite();
                        _videoCont.name = "videoCont";
                        _videoCont.addEventListener(MouseEvent.CLICK, onVideoClickHandler);
 
                        var len:int = _videoData.*.length();
                        for (var i:int = 0; i < len; i++)
                        {
                                var player:VideoPlayer = new VideoPlayer(_videoData.*[i].video, _videoData.*[i].preview);
                                        player.x = ApplicationData.NEWS_W * i;
                                        player.id = i;
                                        player.name = "player" + i;
                                _videoCont.addChild(player);
                        }
                        addChild(_videoCont);
                }
 
                private function onVideoClickHandler(e:MouseEvent):void
                {
                        trace(e.target.name, e.currentTarget.name);
                }


etc 06.09.2010 17:29

Так mouseChildren же есть. Отключаем и радуемся нужному target.

nOobCrafter 06.09.2010 17:34

то есть мне надо предварительно залезть в каждого ребенка и у него там все внутри рубануть? не проще ли оставить туже строчку в том же цикле, в чем выйгрышь? мы не пишем листенер в цикле, зато в цикле рубашим детей. Алгоритм интересный конечно, вот хотелось бы узнать.

etc 06.09.2010 17:37

Нет. Надо добавить строчку player.mouseChildren = false. Либо прямо в конструкторе VideoPlayer поставить super.mouseChildren = false, если сам класс не предполагает внутренних элементов управления.

nOobCrafter 06.09.2010 17:40

да я как раз таки об обоих этих вариантах и говорил, получается что листенер мы переносим из цикла, зато пишем чтото из вышеописанного. В чем выйгрыш \ преимущество данного варианта, перед примером из старттопика (где идет подписка на каждый обьект)?

i.o. 06.09.2010 17:44

типа листенер всего один, следовательно меньше нагрузка на ЦПУ, память, GC и т.д в таком духе)

etc 06.09.2010 17:47

Не говоря уже о том, что можно сносить эти плееры без отписок.

Alex Burn 06.09.2010 19:05

У меня стала такая проблема. Сделал минюшку с вашей помощью, вроде все работает. Но как мне сейчас при нажатии на одну из иконок меню, в функции MenuClick заставить переходить на тот адрес который должен открываться?
Вот пример кода
Код AS3:

 
                public function MenuClick(e:MouseEvent):void {
                        clip=e.target as MovieClip;
                        switch(clip){
                                case Что тут писать?:navigateToURL(new URLRequest("#"));break;
                                case И тут?:navigateToURL(new URLRequest("###"));break;
                                }
                        var growX:Tween=new Tween(clip,"scaleX",Elastic.easeOut,1,0.7,3,true);
                        var growX2:Tween=new Tween(clip,"scaleX",Elastic.easeOut,0.7,1,3,true);
                        var growY:Tween=new Tween(clip,"scaleY",Elastic.easeOut,1,0.7,3,true);
                        var growY2:Tween=new Tween(clip,"scaleY",Elastic.easeOut,0.7,1,3,true);
 
 
                }



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

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