Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Доступ к экземплярам составного экземпляра (http://www.flasher.ru/forum/showthread.php?t=204556)

Fogflasher 03.11.2013 00:32

Доступ к экземплярам составного экземпляра
 
Всем привет.

В библиотеке есть составной мувиклип Clipdriver, который состоит из:

- рамки Frame
- области проигрывания мувиклипа Container,
- контейнера кнопок Buttonholder,
- кнопок управления: Button1, Button2, размещенных в этом Buttonholder'е.

Есть также три мувиклипа, которые должны проигрываться этим Clipdriver'ом.

Все вышеперечисленные объекты пролинкованы галочкой к одноименным классам.
Однако, каждый класс присутствует в виде .as файла, поэтому они не dynamic.

Опираясь на Третью Заповедь Wolsh'a, согласно которой, детям нельзя дергать родителей, я решил избежать употребления слушателей в кнопках Button1, Button2 (например, посредством хитрого обращения вверх типа this.parent.parent или там this.root, и т.п.) и решить эту проблему иначе.

Заморочка1: Я не знаю как толком "иначе".
Поэтому решил сделать вот как: создать внутри класса Clipdriver универсальный слушатель, который работает так:

Код AS3:

this.addEventListener(MouseEvent.CLICK, clipdriverHandler);
private function clipdriverHandler(e:Event)
                {
                        //здесь отлавливаем нажатие на кнопки, например с помощью
                        //e.target.parent, для того чтобы передать экземпляру Container
 
                }

Заморочка2: И вот тут я понял, что не понимаю как отловить имя экземпляра класса Container!
То есть, когда мы создаем его посредством кода, тут всё легко. Но вот когда он формируется сам, потому что является частью более сложного экземпляра, то возникает непонимание. Нет, я конешно могу его узнать посредством trace, там будет что-то типа instance6, но это на уровне самого класса Container. А как его передать вверх? Ведь это ересь и анафема.

Сначала я подумал, что можно провернуть вот такой финт: в классе Container ввести строку:
Код AS3:

this.name = "container1";

и уже по имени отловить его в методе выше. Однако - неприятный сюприз, этот способ выдает ошибку:
Цитата:

Error #2078: The name property of a Timeline-placed object cannot be modified.
Потом я начал прикидывать: может быть создать в классе Container некое свойство, например, current_c, и присвоив ему this, как-то передать его выше. Однако это парадокс: нельзя передать свойство класса, содержащее имя экземпляра класса, не зная имени экземпляра класса.
(Вот щас подумал, может быть тут как-то статические свойства/методы использовать).

И наконец, третья идея: попробовать отловить событие ДОБАВЛЕНИЯ ЭКЗЕМПЛЯРА В ЭКЗЕМПЛЯР, и уже из него выцепить нужные имена.
Однако, я не знаю есть ли вообще такое? Генерирует ли оператор:
Код AS3:

this.addChild(mc);

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

Короче, что-то я запутался в этом разнообразии, прошу подсказок в любых направлениях.

А то начинаешь невольно приходить к выводам, что вот такие многовложенные формации нужно делать исключительно кодом.
То есть вбивая координаты каждого объекта по отношению к другому, юзать каскады addChild'ов и т.п. А это более муторно.

Всё-таки собрать в редакторе нужный объект посредством визуальных инструментов как-то проще и приятнее.

Akopalipsis 03.11.2013 00:45

Clipdriver.getChildAt() или Clipdriver.getChildByName() - так можно к детям обратится.
А про события внутри элемента из адобафлеш.. Если бы меня препёрло когда нибудь, что то в нём нарисовать, то слушателей я бы там не делал.
Мне кажется, лучше при помощи тех же методов, что я написал выше, присвоить ссылки переменным в классе и уже в самом классе и слушателей создавать.

Frost47rus 04.11.2013 13:14

Перечитал трижды. А что сделать-то хотите?
И да, приложите fla-шку, чтобы понимать как вы всё устроили в редакторе.

Fogflasher 06.11.2013 09:18

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

Frost47rus, пока показывать что-то нет особого смысла. Вобщем, это некий простейший аналог ТВ-пульта, который переключая каналы, меняет отображаемый мувиклип. Кстати, если где-то кому-то встречались исходники реализация такого рода, было бы интересно заценить.


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

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