Показать сообщение отдельно
Старый 03.11.2013, 00:32
Fogflasher вне форума Посмотреть профиль Отправить личное сообщение для Fogflasher Найти все сообщения от Fogflasher
  № 1  
Ответить с цитированием
Fogflasher

Регистрация: Mar 2013
Сообщений: 290
Post Доступ к экземплярам составного экземпляра

Всем привет.

В библиотеке есть составной мувиклип 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'ов и т.п. А это более муторно.

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


Последний раз редактировалось Fogflasher; 03.11.2013 в 00:44.