2016-06-24 13 views
6

Я пробовал SWFLoader, но проблема в том, что загруженный контент - это MovieClip, и я не знаю, как с ним взаимодействовать, а MovieClip # numChildren равен нулю.Как загрузить swf и взаимодействовать с ним?

И, кстати, я не могу передать flashvars в swf.

+0

Свойство 'numChildren', и, вероятно, SWF, который вы загружаете, записывается так, чтобы он добавлял свой контент непосредственно в' stage'. – Vesper

+0

@ Vesper, тогда как я мог бы с ним взаимодействовать? MovieClip # stage возвращает значение null. –

+0

Пока вы ожидаете ответа SWFLoader/Flex ... Что произойдет, если вы используете код AS3 (внутри '') для загрузки SWF с использованием API-интерфейса Loader? –

ответ

3

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

Для этого примера предположим, что у нас очень простой SWF (загруженный SWF), который содержит TextField (называемый txt_url) и кнопку (MovieClip, называемую btn_go).

Кнопка btn_go откроет URL-адрес, введенный в текстовом поле txt_url.

Для нашего второго SWF (загрузчик), мы будем использовать Loader объект, чтобы загрузить наш первый (который в этом случае будет Loader.content), а затем мы установим URL (txt_url текста) и вызвать нажмите на кнопку btn_go.

Так вот пример кода нашего loader.swf:

var loader:Loader = new Loader(); 
    loader.contentLoaderInfo.addEventListener(Event.COMPLETE, on_SWFLoad); 
    loader.load(new URLRequest('loaded.swf')); 
    addChild(loader); 

function on_SWFLoad(e:Event): void 
{ 
    // get our loaded SWF 
    var loaded_swf:DisplayObjectContainer = DisplayObjectContainer(loader.content); 

    // because we know our target objects, we can use "getChildByName()" 
    // set the URL 
    TextField(loaded_swf.getChildByName('txt_url')).text = 'http://www.example.com'; 

    // open the URL in the browser by triggering the click event on the "btn_go" button 
    MovieClip(loaded_swf.getChildByName('btn_go')).dispatchEvent(new MouseEvent(MouseEvent.CLICK));  
} 

Этот пример непосредственно установить и открыть URL в браузере после загрузки SWF, конечно, мы можем выполнить это действие после нажатия или что-то еще, но это просто простой пример, чтобы показать вам, как вы можете это сделать.

Теперь проблема в том, что мы ничего не знаем о загруженном SWF и его дочерних элементах (именах, глубинах, ... .), в этом случае мы должны делать больше усилий, чтобы делать то, что хотим: мы должны пройти весь список отображения загруженного SWF, чтобы идентифицировать целевые объекты.

Возвращаясь к нашему примеру, и скажем, что мы знаем только, что есть TextField и кнопка на сцене, так что наш код может быть, как это, например:

function on_SWFLoad(e:Event): void 
{ 
    var loaded_swf:DisplayObjectContainer = DisplayObjectContainer(loader.content); 
    var num_children:int = loaded_swf.numChildren; 

    for(var i:int = 0; i < num_children; i++) 
    { 
     var child:DisplayObject = loaded_swf.getChildAt(i); 

     if(child is TextField) 
     { 
      trace(child.name);   // gives : txt_url 
      TextField(child).text = 'http://www.example.com'; 
     } 
     else 
     { 
      if(child.hasEventListener(MouseEvent.CLICK)) 
      { 
       trace(child.name);  // gives : btn_go 
       child.dispatchEvent(new MouseEvent(MouseEvent.CLICK)); 
      } 
     } 
    } 
} 

Опять же, это очень просто пример, чтобы показать, как мы можем продолжить ...

...

Тогда о прохождении значений (Params) между СФБ, посмотрите на my answer of this question, где у вас есть маленький пример для этого.

Для получения дополнительной информации о Display programming (список отображения, экранный объект, контейнер отображения объектов, ...) посмотреть here.

Надеюсь, что это поможет.

 Смежные вопросы

  • Нет связанных вопросов^_^