Доступ к переменным внутри встроенного SWF?(AS2) - PullRequest
0 голосов
/ 20 августа 2011

Сейчас я работаю над кодом AS2, который должен:

  • Загрузить еще один SWF AS2.
  • Показать еще один мувиклип над загруженным SWF.
  • Доступ к переменным внутри загруженного SWF-файла MovieClip.

Вот мой код, на данный момент:

    loadMovieNum("player.swf",5);
    delay = function () {
    var first:MovieClip = _root.attachMovie("OnTop","nf",10);
    trace(_root.nf);
    trace(_layer5);
    clearInterval(delayi);
    }

delayi = setInterval(delay, 3000); //3 seconds to let the video load. 

Я пытаюсь показать рисунок выше загруженного SWF ("OnTop«Это имя, которое я дал символу (его тип - MovieClip), но что происходит, когда видео показывается выше всего остального, и вывод трассировки:

_level0.nf
undefined

Что я делаю неправильно?Почему новый MovieClip не отображается над загруженным?И, кроме того, после загрузки SWF-файла, как я могу получить доступ к переменным внутри основного MovieClip?

1 Ответ

0 голосов
/ 22 августа 2011

Я бы лично сделал это с 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 в функции-обработчике, поскольку область действия функции не изменилась.

...