Я бы лично сделал это с MovieClipLoader. Использование таймера для предположения, что длительность загрузки очень опасна, так как создает состояние состязания, при котором пользователи с очень медленными соединениями потерпят неудачу.
Это простой пример использования MovieClipLoader и Delegate для сохранения области функции события локальной для остальной части вашего кода, как это делает addEventListener в AS3. Сначала загружаем SWF, который я назвал child.swf. Он содержит анимацию и в кадре 1 определяет строковую переменную с именем 'hello':
var hello:String = "Hi";
В родительском SWF-файле у нас будет код загрузчика и элемент библиотеки с идентификатором «mc1», который будет прикреплен к этапу над загруженным SWF-файлом.
//grab Delegate to mimic AS3 event handler scope
import mx.utils.Delegate;
//create container for the loaded SWF
var loadedMC:MovieClip = createEmptyMovieClip("loadedMC",5);
//create the loader (don't cast it though, or you can't directly access the events)
var loader = new MovieClipLoader();
//set up a listener for the load init (called when the first frame of the loaded MC is executed)
loader.onLoadInit = Delegate.create(this, onMovieInit);
//start loading
loader.loadClip("child.swf",loadedMC);
//init handler
function onMovieInit()
{
//create the next layer from the library
var firstMC:MovieClip = attachMovie("mc1","newName",10);
//trace var from loaded mc
trace(loadedMC.hello); // hi
}
MovieClipLoader вызывает функцию onLoadInit
, когда целевой SWF-файл загружен и первый кадр обработан, что означает, что любой код в первом кадре теперь доступен для родительского SWF-файла. Делегируя вызов onLoadInit
вместо использования объекта слушателя в качестве официальной документации, вы бы хотели, чтобы вы сняли требование использовать _root
в функции-обработчике, поскольку область действия функции не изменилась.