AS3: Как добавить прослушиватели событий к объектам в SWF, которые я загружаю динамически? - PullRequest
2 голосов
/ 13 января 2010

У меня есть родительский SWF (Parent), который обрабатывает пользовательскую навигацию между несколькими дочерними SWF (Child_1, Child_2, Child_3).

Как добавить прослушиватели событий для кнопок навигации на дочерних SWF-файлах, чтобы пользователь мог перемещаться в боковом направлении между Child_1, Child_2 и Child_3?

Я могу придумать два варианта, но не могу заставить ни один работать:

1) Родительский SWF-файл устанавливает прослушиватели событий при загрузке дочернего элемента. Поэтому для загрузки Child_1 я использую загрузчик Parent, а в Parent добавляю обработчики событий в Child_1.myNavigationform.myButton.

Проблема здесь в том, что Parent передает только экземпляр загрузчика, и я не могу представить, как он будет детализирован до отдельных объектов в Child_1.

2) Child_1 добавляет прослушиватели событий к своим собственным объектам. Это просто решает проблему. Child_1 не имеет проблем с доступом к своим собственным кнопкам, но когда пользователь щелкает их, у него нет возможности доступа к методам родительского элемента, так что Child_2 может быть загружен.

Какое решение здесь? Я уверен, что это часто делается. Я просто не видел ничего, что объясняло бы, как с этим справиться.

Спасибо.

1 Ответ

2 голосов
/ 13 января 2010

Вы можете пойти с ними обоими. Но первый из них более гибкий, поскольку он обеспечивает слабосвязанные родительские и дочерние фильмы. Вы можете получить дочерний мувиклип с помощью contentloaderinfo.

_child1loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onComplete);
_child1loader.load(child1URLRequest);
function onComplete(e:Event):void {
  _child1movie = MovieClip(e.target.content);
}
Теперь вы можете добавить это к своему родительскому фильму и вызвать его функции, добавить слушателя к его компонентам.
Во втором случае, если вы хотите получить доступ к функциям родительского фильма, тогда вы нужно поместить эту вещь в фильмы вашего ребенка. (например, parent.somefunction ();).
И гораздо лучшая реализация была бы в том, чтобы каждый дочерний фильм давал некоторую функциональность через диспетчеризацию событий (т.е. navigateNextEvent и т. д., которые могут использоваться фильмами-загрузчиками, т.е. в этом случае родительским фильмом). Таким образом, в этом случае реализация будет выглядеть так:
public class Child1 extends MovieClip {
  ...
  private function onSomeButtonPressWhichWillAskParentToGoToNextChild():void {
    dispatchEvent(new Event("navigateNext"));
  }
  ...
}
...
public class Parent extends MovieClip{
 ...
 _child1movie.addEventListener("navigateNext", onNavigateNext);
 private function onNavigateNext(e:Event):void {
 //e.target is _child1movie, so you can play with it (hide it or throw it away etc...)
 //do actual naigation
 }
 ... 
}
...