У меня есть несколько изменений в ответе выше, которые могут быть полезны.
Слушатель важен для ссылок на сцену только в том случае, если SWF-файл потенциально может быть загружен как модуль в другое приложение. Если этот класс документа гарантированно является корневым классом документа, то добавление события по сути бессмысленно. Я изменил ответ выше, чтобы он шел быстрее, если он является корневым SWF, без ущерба для модульности.
Я бы порекомендовал изучить структуру, подобную RobotLegs, для организации вашего кода. Большинство людей, которые переходят к более интерактивному сценарию, думают, что им не нужно начинать с них, и в конечном итоге понимают, что они существуют по очень веским причинам, а именно, что зависимости в этой области работы быстро запутываются. Если бы вы выбрали RobotLegs, ваш класс 'Main' был бы фреймворком Context.
В любом случае, чтобы быть полезным, вашему главному классу потребуется доступ к списку отображения, поэтому вам нужно будет передать ссылку на класс Document. Однако передайте его в преобразовании в DisplayObjecContainer, чтобы избежать зависимости от Document in Main.
Вам также не нужно расширять MovieClip, поскольку здесь нет временной шкалы; Спрайт будет служить так же хорошо, и класс будет немного легче. Нет и веских оснований выставлять основную переменную - если вы собираетесь использовать SWF модульно и предоставлять API в классе документа, вы все равно не хотите открывать класс Main, вам нужен интерфейс. (К сожалению, вы не можете использовать интерфейс Document и загружать его как модульный SWF-файл - или вы не могли по крайней мере сделать это для Flash Player 9 - так как существует ошибка, связанная с этим процессом: сообщение в блоге о проблемах, связанных с SWF
С этими изменениями, ответ выше:
package
{
import flash.display.Sprite;
import flash.events.Event;
public class Document extends Sprite
{
private var main:Main;
public function Document()
{
if (stage)
init();
else
addEventListener(Event.ADDED_TO_STAGE, onAddedToStage, false, 0, true);
}
private function onAddedToStage(event:Event):void
{
removeEventListener(Event.ADDED_TO_STAGE, onAddedToStage);
init();
}
private function init():void
{
main = new Main(this);
}
}
}
Но ваш основной класс не будет знать тип документа, поэтому:
package
{
import flash.display.DisplayObjectContainer;
public class Main
{
private var viewComponent:DisplayObjectContainer;
public function Main(viewComponent:DisplayObjectContainer)
{
this.viewComponent = viewComponent;
...
}
}
}