Вход

Просмотр полной версии : Доступ к MovieClip'ам, вложенным в Button


deep_freeze
21.02.2008, 17:12
Вопрос заключается вот в чём.

1. Допустим, у нас имеется MovieClip. Мы присваиваем его экземпляру имя mc.

2. В него мы из библиотеки может добавить экземпляр какого-то другого мувиклипа, присвоив ему InstanceName = "l1" (по номеру уровня).

3. В этот l1 можно добавить экземпляр третьего мувиклипа из библиотеки, присвоив этому экземпляру имя "l2".

4. В l3 помещается ещё один экземпляр и называется l3.

Таким образом, для того, чтобы заставить ролик l3 проигрываться с метки под названием "play_l3", нужен следующий код:

_level0.mc.l1.l2.l3.gotoAndPlay("play_l3");

Это работает для всех мувиклипов, но что касается кнопок (символов типа Button), здесь ситуация немного другая.

1. Создаём кнопку. Называем её "btn". В кадр "Up" добавляем экземпляр мувиклипа из библиотеки, называем его l1.
2. В l1 добавляем ещё один экземпляр, называем его l2.
3. В l2 добавляем ещё один экземпляр, называем его l3.

Значит для того, чтобы запустить анимацию с метки "play_l3" нужен соответственно код

_level0.btn.l1.l2.l3.gotoAndPlay("play_l3");

Но данный код не работает, трассировка показывает, что _level0.btn.l1.l2.l3 не определён, а путь до l3 выглядит следующим образом:

_level0.btn.l1.instance2.l3

Вопрос заключается в том, почему Флеш использоват для l2 автоматическое именование (сгенерированное название "instance2"), и не воспользовался заданным вручную значением "l2"? В мувиклипах такой проблемы нет, а вот при большой вложенности мувиклипов в кнопках она встречается постоянно.

Можно, конечно, в дебаггере посмотреть автоматически просвоенное название экземпляра и обращаться к l3 следующим образом:

_level0.btn.l1.instance2.l3.gotoAndPlay("play_l3");

Но, кроме того, что такой подход очень неудобен для восприятия, он вносит существенную проблему, которая заключается в том, что при добавлении в ролик экземпляров мувиклипов без названия (которым Флеш автоматически просвоит имена), instance2 может уже оказаться, скажем, instancе5 и далее в том же духе...

Что это такое с именованием экземпляров в кнопках и как с этим можно бороться?

iNils
21.02.2008, 19:58
Либо использовать мувкилипные-кнопки.
Либо внутри мувиклипов, которые распологаются в кнопках написать код, переопредляющий инстансы
this._name = "l1";

Olegg
21.02.2008, 20:32
не,переопределять инстансы - это головняк.Лучше всегда использовать MovieClip.

deep_freeze
22.02.2008, 14:45
Дело в том, что мне нужно было получить возможность корректно перехватывать событие, когда пользователь наводит мышь на ролик и убирает её с него. В MovieClip'ах событие on (rollOver) далеко не всегда вызывалось (если быстро двигать курсором над мувиком, оно практически не вызывается), а вот у Button'ов оно вызывается всегда. Вот по какой причины я решил уйти от MovieClip'ов с человеческим именованием instance'ов к кнопкам. Да, с переопределением инстансов не очень весело получается... :( Но можно и с ним помучиться, всё-таки проблема с instance на такая серьёзная, как проблема с не вызвающимся onRollOver в мувиках...

this._name = "l1";

Спасибо за совет. Сам не понимаю, как я вчера до этого не додумался! :)

iNils
22.02.2008, 15:53
В MovieClip'ах событие on (rollOver) далеко не всегда вызывалось (если быстро двигать курсором над мувиком, оно практически не вызывается), а вот у Button'ов оно вызывается всегда. Вам померещилось. Механика у них одна. Баттонов точно также может упустить мышь. И знаете почему? Потому, что мышь двигается дискретно, и при быстром движении, два ее положения могут оказаться по разные стороны кнопки, поэтому событие и не работает. Так что не надо морать доброе имя мувиклипов.

deep_freeze
22.02.2008, 17:41
Вам померещилось. Механика у них одна. Баттонов точно также может упустить мышь. И знаете почему? Потому, что мышь двигается дискретно, и при быстром движении, два ее положения могут оказаться по разные стороны кнопки, поэтому событие и не работает. Так что не надо морать доброе имя мувиклипов.

Да, это всё объясняет. Сегодня долго издевался над кнопками, водя над ними курсором. onRollOver, как ни странно, срабатывал всегда, или во всяком случае, его несрабатывание совсем незаметно для пользователя.

iNils
22.02.2008, 18:06
А вы зря мучаетесь с этим. Обычные текстовые ссылки в html, ведут себя точно также. Поэтому если ваша кнопка имеет нормальные размеры, чтобы по ней можно было попасть со скоростью много выше обычной скорости перемещения мыши, то пользователь делает это сознательно и это неопадание лежит на его совести.