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

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

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


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

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