Отследить нажатый объект в массиве

То что касается флеша, но не касается ВКонтакте API. Например проблемы при создании прыгающего мячика.
Ответить
MrDead
Сообщения: 103
Зарегистрирован: 13 сен 2012, 00:46

Отследить нажатый объект в массиве

Сообщение MrDead »

Есть массивы такого вида
massiv = [];
massiv_2 = [];

В массиве massiv 4 элемента одинакового вида объектов. [object mvc_l],[object mvc_l],[object mvc_l],[object mvc_l]

Суть в том, что мне надо отследить мышкой объект расположенный на сцене и запустить анимацию объекта из другого массива, который расположен вокруг каждого объекта object mvc_l
В данном случае имеет такой вид слушатель

Код: Выделить всё

addEventListener(MouseEvent.MOUSE_OVER, _sher);

Код: Выделить всё

private function _sher(event:MouseEvent):void        {                 massiv_2[0].visible = true;                tm_info.start();                }
Если наведем мышкой на любой объект из массива massiv, то анимация проигрывается massiv_2 с индексом 0. Вопрос в том, как мне отследить каждый объект и запускать анимацию элемента из массива massiv_2 соответствующее индексу массива massiv? Надо каждому объекту дать слушатель через цикл? Или как?))
XELAD
Сообщения: 205
Зарегистрирован: 17 июл 2012, 05:25

Re: Отследить нажатый объект в массиве

Сообщение XELAD »

Добавить в класс mvc_l переменную, указывающую его индекс в массиве, к примеру indexInArray

Код: Выделить всё

public var indexInArray = 0;
Во время составления massiv каждому mvc_l указать его индекс:

Код: Выделить всё

 var mySmth = new Mvc_l(); //Предположительно у вас такmassiv.push(mySmth);mySmth.indexInArray = massiv.length - 1;
А в _sher прописать следующее:

Код: Выделить всё

massiv_2[event.target.indexInArray].visible = true;
Конечно, всё это будет работать, если не изменять массивы, иначе индексы будут указывать не на то, что нужно.
Есть и другие варианты...
MrDead
Сообщения: 103
Зарегистрирован: 13 сен 2012, 00:46

Re: Отследить нажатый объект в массиве

Сообщение MrDead »

А какие варианты еще есть? В будущем элементы массива будут удаляться и заменяться.
Как самый крайний вариант, с излишком кода у меня есть такой, дать каждому объекту слушатель и запускать анимацию, типо так

Код: Выделить всё

massiv[0].addEventListener(MouseEvent.MOUSE_OVER, _sher);massiv[1].addEventListener(MouseEvent.MOUSE_OVER, _sher);massiv[2].addEventListener(MouseEvent.MOUSE_OVER, _sher);
и т.д. Можно было бы его как-то сократить
sasha^
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52

Re: Отследить нажатый объект в массиве

Сообщение sasha^ »

попробуй так:

Код: Выделить всё

private function _sher(event:MouseEvent):void        {                massiv_2[massiv.indexOf(event.target)].visible = true;                // суть в том что мы находим номер элемента в массиве при помощи его поиска                // при маленьких массивах - норм, при большом - лучше вариант с номерами элементов...               // если это мувики - то можно назначать числа так: mc.myNumber = 1;                // все это из-за того что мувик - динамический класс                tm_info.start();               }
MrDead
Сообщения: 103
Зарегистрирован: 13 сен 2012, 00:46

Re: Отследить нажатый объект в массиве

Сообщение MrDead »

Код: Выделить всё

    private function _shere_del(ev:TimerEvent):void        {                            massiv_2[massiv.indexOf(ev.target)].visible = false;                tm_info.stop();                    } 
Так-то вроде работает, но вот выше код вызывает ошибку. Суть в том, что после наведения мыши на объект, запускается таймер, по истечению которого, объект снова становится невидимым, но вот вызывает ошибку

[Fault] exception, information=TypeError: Error #1010: A term is undefined and has no properties.
sasha^
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52

Re: Отследить нажатый объект в массиве

Сообщение sasha^ »

ошибка в том что ev в обработчике таймера имеет тип TimerEvent и таймер не знает какой был видим...
потому создать переменную которая бы сохранила ссылку на объект и потом просто сделать невидимым...

Код: Выделить всё

private function _sher(event:MouseEvent):void        {                massiv_2[massiv.indexOf(event.target)].visible = true;                gl = event.target;                // суть в том что мы находим номер элемента в массиве при помощи его поиска                // при маленьких массивах - норм, при большом - лучше вариант с номерами элементов...               // если это мувики - то можно назначать числа так: mc.myNumber = 1;                // все это из-за того что мувик - динамический класс                tm_info.start();               }

Код: Выделить всё

private function _shere_del(ev:TimerEvent):void        {                           gl.visible = false;                tm_info.stop();                   }
где gl - глобальная переменная имеющая тип тот же что и объект на сцене
MrDead
Сообщения: 103
Зарегистрирован: 13 сен 2012, 00:46

Re: Отследить нажатый объект в массиве

Сообщение MrDead »

Вроде работает, но с одним объектом. Если навести мышкой на несколько объектов, например после первого, на второй, то к первому варианту не применяется false, а применяется ко второму объекту, а предыдущий так и висит true
sasha^
Сообщения: 711
Зарегистрирован: 10 сен 2012, 16:52

Re: Отследить нажатый объект в массиве

Сообщение sasha^ »

тогда сделай массив состояний нажатия...
Ответить