Форум 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=144076)

angry_beaver 02.09.2010 03:38

Как получить массив из eventListener?
 
Всем привет!

Вопрос следующий:


Есть функция-
Код AS3:

function initButtons(arr:Array):void {
 
        for(var i:int = 0; i<arr.length; i++){
                arr[i].id = i;
                arr[i].buttonMode = true;
                arr[i].addEventListener(MouseEvent.MOUSE_OVER, playOver);
                arr[i].addEventListener(MouseEvent.MOUSE_OUT, playOut);
                arr[i].addEventListener(MouseEvent.CLICK, doClick);               
        }//for

-как мне передать arr[i] в playOver из этой функции когда происходит событие?

-как получить целый массив при наведении курсора мыши на какой-либо объект этого массива? Например: если у меня в массиве кнопки, то когда я навожу курсор на любую из кнопок я получаю весь массив целиком?

:victory:

AirDecade 02.09.2010 06:34

Вариант 1:
Добавить в данный класс переменную под Array и в этой функции просто присваивать ей arr, переданный в параметре. Из функций-обработчиков обращаться к этой переменной.
Вариант 2:
В объект, который в массиве, добавить переменную, в которую записывать этот массив и обращаться к нему через event.target

angry_beaver 02.09.2010 06:54

Цитата:

Сообщение от AirDecade (Сообщение 933001)
Вариант 1:
Добавить в данный класс переменную под Array и в этой функции просто присваивать ей arr, переданный в параметре. Из функций-обработчиков обращаться к этой переменной.
Вариант 2:
В объект, который в массиве, добавить переменную, в которую записывать этот массив и обращаться к нему через event.target


Я не совсем понял. Дай пример простенький пожалуйста!

AirDecade 02.09.2010 07:30

Код AS3:

public class SomeClass {
 
                private var buttons:Array;
 
                ........
 
                function initButtons(arr:Array):void {
 
                        buttons=arr;
                        for(var i:int = 0; i<arr.length; i++){
                                arr[i].id = i;
                                arr[i].buttonMode = true;
                                arr[i].addEventListener(MouseEvent.MOUSE_OVER, playOver);
                                arr[i].addEventListener(MouseEvent.MOUSE_OUT, playOut);
                                arr[i].addEventListener(MouseEvent.CLICK, doClick);               
                        }
                }
                function playOver(e:MouseEvent):void {
 
                        for(var i:int = 0; i<buttons.length; i++){
                                //Что-то делаем               
                        }
                }
}

Второй вариант - если в arr находятся свои какие-то объекты, то добавить им свойство buttons и в том цикле добавить строчку
Код AS3:

arr[i].buttons = arr;


alatar 02.09.2010 12:10

Цитата:

когда я навожу курсор на любую из кнопок я получаю весь массив целиком?
В event.currentTarget вы получите ссылку на кнопку (по-сути ваш arr[i])

-De- 02.09.2010 12:20

Опять вопрос из серии "как передать парамер в слушатель" - ищите по форуму. Регулярно всплывает. Интересно, будет ли толк, если статью написать...

gloomyBrain 02.09.2010 12:22

@angry_beaver
Цитата:

как получить целый массив при наведении курсора мыши на какой-либо объект этого массива? Например: если у меня в массиве кнопки, то когда я навожу курсор на любую из кнопок я получаю весь массив целиком?
Для этого можно передать ссылку на массив в каждый элемент массива

alatar 02.09.2010 12:25

Цитата:

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

gloomyBrain 02.09.2010 12:36

Цитата:

Зачем плодить ссылки?
Вероятно, массивов может быть несколько

iillyyaa 02.09.2010 16:41

AirDecade, про приведённый код, я мало понимаю пока в флеше, но, помоему это бред.

будет у нас массив из 1000 элементов, и мы будет все 1000 перебирать при нажатии на каком то из них ? а если массивов несколько ? и как в этом коде найти нужный элемент массива ?


-De- больше чем уверен, что толк будет, я лично чуть в теории понимаю, какие то ссылки на этот объект (массив) передаются при клике, но пока не понимаю как к ним обратиться и т.д. :)

alatar 02.09.2010 16:56

Цитата:

я мало понимаю пока в флеше
После этой фразы следовало поставить точку и дальше не писать. Человек спросил, ему ответили. Что он будет делать с этим примером, дело уже спросившего.

iillyyaa 02.09.2010 18:02

человек спросил, как передать массив по нажатию кнопки, а ему сказали как перебрать элементы массива.. разницу чуствуете ?

это тоже самое, как сказать, в универсам завезли колбасу по 200р.
а он будет решать, пойдет он в универсам за колбасой или нет..

Добавлено через 4 минуты
я наверно настолько тупой, что не вижу, как передан массив arr (который автор хочет передать)
я лишь вижу, что зачем то создан второй массив и зачем то в фунции его перебирают.. "что то делая" :)

AirDecade 02.09.2010 19:26

2-ой массив не создан. buttons - лишь переменная, ей присваивается первый массив. Таким образом массивов всего 1 штука.

код
Код AS3:

for(var i:int = 0; i<buttons.length; i++){
                                //Что-то делаем               
                        }

я написал просто как пример обращения к массиву. Если нужно не перебрать его элементы, а что-то другое сделать, значит этот цикл не нужен.

iillyyaa 02.09.2010 20:19

нужно знать или значение ячейки массива или же имя массива + номер ячейки

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

у человека 10 кнопок и 10 прямоугольников, нажав на кнопку мы удаляем прямоугольник рядом с кнопкой.. как твоя фунция удалит именно тот прямоугольник ?

AirDecade 02.09.2010 20:53

Цитата:

Сообщение от iillyyaa (Сообщение 933135)
нужно знать или значение ячейки массива или же имя массива + номер ячейки

Можно цитату?


length у массива.
arr виден только внутри initButtons.


Цитата:

Сообщение от iillyyaa (Сообщение 933135)
у человека 10 кнопок и 10 прямоугольников

Где вы их у него нашли?

Psycho Tiger 02.09.2010 21:19

iillyyaa, ага, в точку.

event.target - там где произошло событие (например, кнопка внутри мувика, подписанного на событие)
event.currentTarget - то что подписали

Цитата:

я наверно настолько тупой, что не вижу, как передан массив arr (который автор хочет передать)
Успокойтесь, Вы мыслите совершенно правильно.

Если честно, мне интересно что хочет доказать AirDecade и почему alatar решил заткнуть здравую мысль у iillyyaa.

iillyyaa 02.09.2010 22:06

Psycho Tiger, евенты я примерно понимаю, но не до конца пока.. как нам выдернуть сам массив ? сначала ссылку на массив, а потом уже и его, с его значениями..

нам нужен индекс массива.. и наверно имя (или же значения массива в некий временный массив)

вот как ? :)

Psycho Tiger 02.09.2010 22:44

Чтобы выдернуть массив из метода - достаточно чтобы он был в скоупе класса. Объявить его как приватное поле класса будет для этого достаточно.

Теперь по event.currentTarget мы получаем ссылку на один из подписанных объектов - точнее на котором был клик. Приводим его к нужному типу. У этого типа есть поле id, мы в цикле ему присваивали значение. Так мы узнаём какой индекс в массиве носит этот объект. Только вот зачем узнавать индекс, чтобы узнать позицию в элементе чтобы выдернуть элемент из элемента, когда у нас этот элемент уже есть - мне неясно.

iillyyaa 02.09.2010 23:13

так где он есть ? я ход мысли понимаю, а код написать не могу.. думаю автор так же :)

есть у нас arr[0]=3; arr[1]=7; arr[2]=19;

как нам получить значение 7 ? и как индекс 1 ?

индексом мы можем из другого массива что то выдернуть.. или же изменить какой то прямоугольник, который завязан индексом с кнопкой..

Psycho Tiger 02.09.2010 23:22

Код AS3:

private var hash:Dictionary=new Dictionary();
 
...
var i:int=10;
while (i--){
var mc:SomeSprite=new SomeSprite();
mc.addEventListener(MouseEvent.CLICK, onClick);
super.addChild(mc);
mc.x=100*i;
hash[mc]=i;
}
 
...
 
private function onClick(event:MouseEvent):void{
trace(hash[event.currentTarget]);
}


alatar 02.09.2010 23:29

Цитата:

почему alatar решил заткнуть здравую мысль у iillyyaa
Что было здравого в той мысли? Если посмотреть предыдущий пост, то автор просил пример кода, AirDecade ему предоставил (именно такой как просил автор – простенький пример доступа к массиву в обработчике события).

Psycho Tiger 03.09.2010 00:04

Цитата:

Сообщение от alatar (Сообщение 933178)
Что было здравого в той мысли? Если посмотреть предыдущий пост, то автор просил пример кода, AirDecade ему предоставил (именно такой как просил автор – простенький пример доступа к массиву в обработчике события).

Подобный перебор элементов в самом начале цикла в контексте вопроса
Цитата:

-как мне передать arr[i] в playOver из этой функции когда происходит событие?
может заставить автора думать что перебор всех элементов - единственная возможность узнать, на каком объекте был клик (arr[i]).
Подобный вопрос должен был расставить точки над i, что это сделано только для примера. По меньшей мере невежливо затыкать людей только по причине того, что они образованы чуть менее, чем Вы.

Проблема описанная выше не высосана из пальца: я со своим опытом понял что "перебор дан для примера" только когда второй раз перечитал полностью тему. Хотя и сейчас я придерживаюсь прежнего мнения: не могу представить себе ситуацию, в которой ради демонстрации получения ссылки на массив её используют в одном месте - в условии цикла.

iillyyaa 03.09.2010 00:30

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

Код AS3:

function initButtons(arr:Array):void {
 
        for(var i:int = 0; i<arr.length; i++){
                arr[i].id = i;
                arr[i].buttonMode = true;
                arr[i].addEventListener(MouseEvent.MOUSE_OVER, playOver);
                arr[i].addEventListener(MouseEvent.MOUSE_OUT, playOut);
                arr[i].addEventListener(MouseEvent.CLICK, doClick);               
        }
        for(var i:int = 0; i<arr2.length; i++){
                arr2[i].id = i;
                arr2[i].buttonMode = true;
                arr2[i].addEventListener(MouseEvent.MOUSE_OVER, playOver);
                arr2[i].addEventListener(MouseEvent.MOUSE_OUT, playOut);
                arr2[i].addEventListener(MouseEvent.CLICK, doClick);               
        }
 
}

Цитата:

-как мне передать arr[i] в playOver из этой функции когда происходит событие?

-как получить целый массив при наведении курсора мыши на какой-либо объект этого массива? Например: если у меня в массиве кнопки, то когда я навожу курсор на любую из кнопок я получаю весь массив целиком?
я догадываюсь, у автора есть функция playOver

Код AS3:

function playOver(event:MouseEvent){
// что то сделать, что бы в переменной xxx было значение индекса к примеру (0 или 1 или 2 и т.д.)
trace(xxx);
//trace должен выдать число 0, 1, 2 или какой там индекс был у массива, где кликнули мышкой
}

как твой код может это реализовать ??? на выходе должно быть 0 или 1 или 2

Добавлено через 3 минуты
Psycho Tiger, я правильно понимаю, мы создаём какой то объект, в него засовываем ссылку, точнее ссылка является индексом, и запихиваем туда нужное нам значение..
из функции онклик, мы имея ссылку выдергиваем из массива hash по индексу равному ссылке значение ячейки ??

angry_beaver 03.09.2010 00:35

Спасибо за ваши ответы!

Я уже который день сижу голову ломаю...я не создавал классов, пытался все сделать линейным программированием, а делаю я меню с выезжающим саб меню.

У меня есть МК(муви клип), в этом МК menu у меня 5 главных МК кнопок (BUT1, BUT2, BUT3, BUT4, BUT5) с анимацией, каждая главная кнопка имеет саб кнопки и я создал 5 МК (but1Sub, but2Sub, but3Sub, but4sub, but5sub). В butSub есть: саб кнопки МК со своей анимацией, и анимация как саб кнопки выпадают когда срабатывает событие для главной кнопки.

Создал массивы:

Код AS3:

var aButtons:Array = [home_btn, services_btn, ted_btn, knowCenter_btn, about_btn]; - главные кнопки
var aSubMenu:Array = [home_sub, services_sub, ted_sub, knowledge_sub, about_sub];- массив со всеми саб менюшками
 
var aHomeSub:Array = []; - массивы для саб кнопок
var aServicesSub:Array = [package_btn, component_btn, prodRel_btn, medical_btn, solar_btn];
var aTedSub:Array = [report_btn, video_btn, accessibility_btn];
var aKnowCenter:Array = [medical_btn, packageTest_btn, railroad_btn];
var aabout:Array = [qm_btn, news_btn, contact_btn, links_btn];//4*/
-
-
-

Идея была такая:
инициализирую главные кнопки aButtons[], при MOUSE_OVER вызываю функцию где главная кнопка делается нажатой, потом вызываю саб менюшку из aSubMenu[]. Из функции где я вызываю саб меню я хочу инициализировать саб кнопки передавая нужный массив в initButtons(arr); таким образом я использую одну и ту же функцию, и так я хочу сделать для всех функций.

Код AS3:

function initButtons(arr:Array):void {
 
        for(var i:int = 0; i<arr.length; i++){
                arr[i].id = i;
                arr[i].buttonMode = true;
                arr[i].addEventListener(MouseEvent.MOUSE_OVER, playOver);
                arr[i].addEventListener(MouseEvent.MOUSE_OUT, playOut);
                arr[i].addEventListener(MouseEvent.CLICK, doClick);
        }//for
}//initButtons
 
function playOver(event:MouseEvent):void{
 
        var currentBtn:int = event.currentTarget.id;
        trace("suka="+currentBtn); //:)
 
        event.target.gotoAndPlay("over");
        setSelectedBtn(currentBtn, aButtons); // если бы я мог получить массив с кнопкой из события, то было бы очень красиво.
        callSubMenu(currentBtn)
 
}//playOver
 
function setSelectedBtn(id:int, arr:Array){
 
        for(var i:int = 0; i<arr.length; i++){
        if(i == id){
                arr[i].gotoAndStop("down");
                arr[i].buttonMode = false;
                arr[i].removeEventListener(MouseEvent.MOUSE_OVER, playOver);
                arr[i].removeEventListener(MouseEvent.MOUSE_OVER, playSOver);
                arr[i].removeEventListener(MouseEvent.MOUSE_OUT, playOut);
                arr[i].removeEventListener(MouseEvent.CLICK, doClick);
 
                }//if
 
        else{
                if(arr[i].currentLabel == "down"){
                        arr[i].gotoAndPlay("out");
                        }//if
                arr[i].buttonMode = true;
                arr[i].addEventListener(MouseEvent.MOUSE_OVER, playOver);
                arr[i].addEventListener(MouseEvent.MOUSE_OVER, playSOver);
                arr[i].addEventListener(MouseEvent.MOUSE_OUT, playOut);
                arr[i].addEventListener(MouseEvent.CLICK, doClick);
 
                }//else                       
 
        }//for
 
}//setSelectedBtn
 
function callSubMenu(id:int):void{
 
        for(var i:int = 0; i < aSubMenu.length; i++){
 
                if(id == i && id !=0)
                        {
                        aSubMenu[i].gotoAndPlay("open");
                        initSubMenuButtons(i);
                        trace("sub open for "+aSubMenu[i]);
                        }//if
 
                else {
                        if(aSubMenu[i].currentLabel == "open")
                        {
                        aSubMenu[i].gotoAndPlay("close");
                        trace("sub closed for "+aSubMenu[i]);
                        }//if
                }//else
        }//for
}//callSubMenu
 
function initSubMenuButtons( id:int ):void{
        trace("initSubMenuButtons for " + id);
 
        switch(id){               
                case 0:break;
                case 1:initButtons(aServicesSub);break;
                case 2:;break; //initButtons(aTedSub)
                case 3:;break; //initButtons(aKnowCenter)
                case 4:;break; //initButtons(aAbout)
                default:break;
        }//switch
 
}//initSubMenuButtons
 
------
MAIN
------
initButtons(aButtons);

В коде могут быть ошибки, т.к. я постоянно все переписываю. Вариант этот еще сырой. Моя задача сейчас инициализировать саб кнопки и как бы мне это все так сделать, чтобы каждая саб кнопка имела уникальный ID чтобы мне вызывать iFrame в html....:umnik2:
Вообщем жесть....не судите строго, я недавно только начал изучать AS3.
Знаю что все это можно организовать с классами, только я не понимаю как это реализовать в моем случае!

Спасибо огромное за вашу помощь!

iillyyaa 03.09.2010 00:38

hash мы можем сделать многомерным массивом, и к примеру обратиться к нескольким данным которые мы передаём..
Код AS3:

hash[0][event.currentTarget]);
hash[1][event.currentTarget]);
hash[2][event.currentTarget]);

к примеру мы передаём 3 переменные.. а дальше мы можем выдернуть из 3 массивов нужные нам данные...

Добавлено через 31 секунду
всё верно ?

angry_beaver 03.09.2010 00:51

Цитата:

а дальше мы можем выдернуть из 3 массивов нужные нам данные...
но у тебя один массив с тремя элементами и ты передаешь объект который вызвал событие в i-тый элемент массива, что ты пытаешься сказать этим?
Цитата:

а дальше мы можем выдернуть из 3 массивов нужные нам данные...

было бы здорово если бы работала такая штука:

Цитата:

var array:Array = new Aray();

array = event.currentTarget.Array;

что-нибудь в таком духе!!!

Psycho Tiger 03.09.2010 00:55

Цитата:

Psycho Tiger, я правильно понимаю, мы создаём какой то объект, в него засовываем ссылку, точнее ссылка является индексом, и запихиваем туда нужное нам значение..
из функции онклик, мы имея ссылку выдергиваем из массива hash по индексу равному ссылке значение ячейки ??
Да. Array - это интовый хеш, Object - это строковой хэш, а Dictionary - это объектный хэш =) Коллекции, так сказать.

Цитата:

я догадываюсь, у автора есть функция playOver
Не функция, а метод. Функция в AS3 это другое.

Добавлено через 1 минуту
angry_beaver,
Код AS3:

class Test{
public var arr:Array=[1,2,3];
}
 
class Main extends Sprite{
trace((new Test()).arr); //1,2,3
}


alatar 03.09.2010 13:56

Цитата:

По меньшей мере невежливо затыкать людей только по причине того, что они образованы чуть менее, чем Вы.
А я считаю не вежливым объявлять бредом код, по причине невнимательности прочтения постов.
Цитата:

AirDecade, про приведённый код, я мало понимаю пока в флеше, но, помоему это бред.

iNils 03.09.2010 14:08

alatar получает второе предупреждение за флейм.

in4core 03.09.2010 15:33

Код AS3:

function initButtons(arr:Array):void {
 
                        for(var i:int = 0; i<arr.length; i++){
                                arr[i].id = i;
                                arr[i].addEventListener(MouseEvent.CLICK, doClick);               
                        }
                }
                function playOver(e:MouseEvent):void {
 
                        trace(e.currentTarget.id);
                        }
                }
}

вот и передали параметр . в чем трабла то?

iillyyaa 03.09.2010 17:31

in4core, вот это в милион раз понятнее :)

dimarik 03.09.2010 23:30

Цитата:

Сообщение от -De- (Сообщение 933033)
Опять вопрос из серии "как передать парамер в слушатель" - ищите по форуму. Регулярно всплывает. Интересно, будет ли толк, если статью написать...

Да, будет. Можно даже в FAQ перенести. Много вопросов по этому поводу.

angry_beaver 04.09.2010 02:38

Цитата:

Сообщение от in4core (Сообщение 933303)
Код AS3:

function initButtons(arr:Array):void {
 
                        for(var i:int = 0; i<arr.length; i++){
                                arr[i].id = i;
                                arr[i].addEventListener(MouseEvent.CLICK, doClick);               
                        }
                }
                function playOver(e:MouseEvent):void {
 
                        trace(e.currentTarget.id);
                        }
                }
}

вот и передали параметр . в чем трабла то?

параметр то передали, а как передать весь массив?

Obi 04.09.2010 02:52

Создать ссылку на массив не пробовали? В особо извращенном случае, можно создать словарь, в котором ключами будут кнопки, а значениями – массивы. (на правах субботы, тему читал поверхностно)

Код AS3:

private function cbuttonClickHandler(event:MouseEvent):void {
  var btn:MyButton = event.currentTarget as MyButton;
  if(_buttonsDict[btn] != null) {
      // do something with button
  }else {
      trace('trace something');
      return;
  }
}


Zik. 04.09.2010 10:02

Цитата:

Сообщение от in4core (Сообщение 933303)
Код AS3:

function initButtons(arr:Array):void {
 
                        for(var i:int = 0; i<arr.length; i++){
                                arr[i].id = i;
                                arr[i].addEventListener(MouseEvent.CLICK, doClick);               
                        }
                }
                function playOver(e:MouseEvent):void {
 
                        trace(e.currentTarget.id);
                        }
                }
}

вот и передали параметр . в чем трабла то?

Трабла в том, что объект должен быть динамичным, то есть использовать либо MovieClip, либо свой собственный класс, в котором объявлен id. Если же у человека Sprite или SimpleButton, то такое решение недопустимо

iNils 04.09.2010 10:54

А в чем проблема с расширить класс?

Psycho Tiger 04.09.2010 12:42

Цитата:

Сообщение от iNils (Сообщение 933465)
А в чем проблема с расширить класс?

Ради одного id`а расширять нежелательно. Это создание лишней сущности, лучше использовать коллекции.

iNils 04.09.2010 12:55

Кто сказал что она лишняя?

Psycho Tiger 04.09.2010 13:02

Она будет лишней если этот параметр будет использоваться только в этом классе и он единично-простой. Я считаю нормальным занаследоваться если нужно тащить за собой 5-6 переменных. Но в случае, когда по клику надо просто передать id - Dictionary это самый лучший вариант.

iNils 04.09.2010 13:06

Цитата:

Я считаю нормальным занаследоваться если нужно тащить за собой 5-6 переменных
Считай.
Если посмотреть на название метода - initButtons, то, если автор не совсем ленивый, был создан класс описывающий свои кнопки и добавить туда id проблемы нет.


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

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