2010-09-22 2 views
4

Есть ли способ вызвать функцию внутри загруженного SWF-файла?Доступ к функции внутри загруженного .swf-файла?

В принципе, у меня есть .swf-файл (A), который загружает другой .swf-файл (B) ... Я бы просто хотел обработать B, как если бы это был какой-то другой экземпляр, добавленный в мой класс .swf "A" ...


Придется переделать "Погрузчик" с именем вашего .swf класса файла:

Loaded .swf класс:

package src { 
import flash.display.MovieClip; 

public class LoadedSWF extends MovieClip  { 
    public function LoadedSWF() { 
    } 

    public function helloWorld():void 
    { 
     trace("hello world from loaded swf!"); 
    } 
} 
} 

Основной класс:

package src { 
import flash.display.Loader; 
import flash.net.URLRequest; 
import flash.display.MovieClip; 
import flash.events.Event; 

public class Main extends MovieClip { 

    private var loader:Loader; 

    public function Main() { 
     loadSWF("LoadedSWF.swf") 
    } 

    private function loadSWF(url:String):void { 
     var urlRequest:URLRequest = new URLRequest(url); 
     loader = new Loader(); 
     loader.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaded, false, 0, true); 
     loader.load(urlRequest); 
     addChild(loader); 

    } 

    private function onLoaded(e:Event):void { 
     var target:LoadedSWF = e.currentTarget.loader.content as LoadedSWF; 
     trace(target); 
     target.helloWorld(); 

     addChild(target); 
    } 
} 

}

ответ

4

В Adobe Flex, вы можете использовать класс flash.display.Loader, чтобы загрузить другой SWF, и добавить прослушиватель событий к нему.

Этот пример взят из Adobe Документация:

var url:String = "http://www.helpexamples.com/flash/images/image2.jpg"; 
var urlRequest:URLRequest = new URLRequest(url); 
var loader:Loader = new Loader(); 
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loader_complete); 
loader.load(urlRequest); 
addChild(loader); 

function loader_complete(evt:Event):void { 
    var target_mc:Loader = evt.currentTarget.loader as Loader; 
    target_mc.x = (stage.stageWidth - target_mc.width)/2; 
    target_mc.y = (stage.stageHeight - target_mc.height)/2; 
} 

Поскольку contentLoaderInfo подкласс EventDispatcher, вы можете также отправлять события в загруженном SWF. Это как вызов функции из SWF, немного сложнее.

+1

Просто для ясности, это не конкретное решение Flex, как предложено. Фактически, ни один из кодов здесь не относится к Flex и является прямым ActionScript 3, который будет компилироваться без импортированных библиотек Flex. – Aaron

+0

Это очень помогает, спасибо. Я взял пример с target_mc и переработал его с моим именем класса .swf, и он сработал! – redconservatory

+0

Отредактированная версия выше ... – redconservatory

7

Есть два случая, т.е.

  1. ребенка швейцарских франков (В) вызывает функцию Родитель швейцарских франков (A) или
  2. Родитель швейцарских франков (A) вызывает функцию загруженного SWF (B)

Во-первых, в обоих случаях вы должны убедиться, что загруженный swf (B) был загружен и добавлен в swf (A) загрузчика, используя Event.COMPLETE. Тогда возможна связь между двумя swf. Загруженный swf похож на любого другого ребенка.

Вот пример кода для случая 2

var mLoader:Loader = new Loader(); 
mLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, onCompleteHandler); 
mLoader.load(new URLRequest("B.swf")); 

public function onCompleteHandler(evt:Event) 
{ 
    var embedSWF:MovieClip = MovieClip(evt.target.content); 
    addChild(embedSWF); 
    embedSWF.function_OF_B(); 
} 

embedSWF.function_OF_B() заявление будет вызывать функцию ребенка швейцарских франков B function_OF_B() т.е.