2011-11-09 62 views
0

我试图从AS3 container调用一个函数,该函数应该调用旧的AS2 SWF,这是无法编辑的因为我们正在谈论1000个swf文件,确实存在某种方式来调用函数内部来自AS3 containerAS2 SWF从AS3容器调用AS2函数

我知道一个可能的方法,通过添加LocalConnection作为written here,但正如我所说我不能编辑所有的SWF文件,所以我只是想知道是否存在一些替代。

+0

您是否尝试将AS2 swf文件作为网桥,并使用LocalConnection。 – ymutlu

回答

0

我不羡慕这种情况一点。我唯一的建议是反编译... 1000个SWF并在那里实现LocalConnection逻辑,如果架构正确,可能在共享SWC中,重新编译SWF并从那里开始。

3

如果您的容器绝对必须用AS3编写,那么您可以在AS2中创建另一个中间容器,它可以直接与1000个现有SWF进行通信,然后可以使用LocalConnection技术与该容器进行通信。

下面的代码是一个简单的例子,但是由于MovieClipLoader在加载到AS3 AVM1对象时似乎不会触发事件,所以我必须实现一个相当丑陋的轮询系统。有关这个问题的问题可以在这里找到:Why do MovieClipLoader events not fire when loaded into an AS3 wrapper?

child_as2.swf - 我们试图加载的一千个AS2文件之一。 - 包含的LocalConnection代码AVM1和AVM2运行时之间的桥梁中介AS2文件

stop(); 

function playMovie() { 
    play(); 
} 

parent_as2.swf:它有它的根,我们希望它被加载时访问定义的功能。由于上面提到的事件问题,这将轮询child_as2.swf以检测它何时加载以及何时存在根上的已知函数。重要的是,在第一轮询呼叫checkProgress被忽略的是这里要注意这将返回不正确的进度值:http://help.adobe.com/en_US/AS2LCR/Flash_10.0/00001380.html

var container:MovieClip = createEmptyMovieClip("container", 10); 
var mcLoader:MovieClipLoader = new MovieClipLoader(); 
var loadStarted:Boolean; 
var checkingInt:Number; 

function checkProgress() { 
    var progObj:Object = mcLoader.getProgress(container); 
    if(progObj.bytesLoaded == progObj.bytesTotal && loadStarted) { 
     //load complete, wait for loadInit 
     if(typeof(container.playMovie) == "function") { 
      //loadInit 
      clearInterval(checkingInt); 
      container.playMovie(); 
     } 
    } 
    //ensures the first loop is ignored due to inaccuracy with reporting 
    loadStarted = true; 
} 

//LocalConnection code 
var myLC:LocalConnection = new LocalConnection(); 

myLC.loadChild = function() { 
    loadStarted = false; 
    mcLoader.loadClip("child_as2.swf", container); 
    checkingInt = setInterval(checkProgress,5); 
} 

myLC.connect("AVM"); 

parent_as3.swf - 外AS3包装。这会将parent_as2.swf加载到AVM1对象中,并通过LocalConnection与它进行通信。

var myLC:LocalConnection = new LocalConnection(); 

var loader:Loader = new Loader(); 
loader.contentLoaderInfo.addEventListener(Event.INIT,onLoaded); 
loader.load(new URLRequest("parent_as2.swf")); 
addChild(loader); 


function onLoaded(event:Event):void { 
    //setTimeout hack to circumvent #2000 Security context error 
    setTimeout(function() { 
     myLC.send("AVM", "loadChild"); 
    },1); 
} 
+0

如果AS2 SWF的军队没有LocalConnection设置,那么通信如何完成AS2-> AS2? – Aaron

+0

这可能是一个解决方案,我会尽快看看! – vitto

+0

@vitto - 我已经开始自己测试它,并遇到中间容器中的MovieClipLoader事件问题。可能是一个交易破坏者... – shanethehat

0

你可以使一个as2 swf做出本地连接。这个swf可以调用你的外部as2文件并返回as3文件的响应。下面的例子,希望它有帮助。

下面的代码块是我之前做过的一个项目。它使用as2文件连接服务器。切出一些代码块希望你能理清解决方案。

// AS3 FILE 
// local connection instance to communicate to AVM1 movie 
var AVM_lc:LocalConnection = new LocalConnection(); 
AVM_lc.client = this; 

// loader loads AVM1 movie 
var loader:Loader = new Loader(); 
loader.load(new URLRequest("log2.swf")); 
//addChild(loader); 
// when AVM1 movie is clicked, call stopPlayback 
stage.addEventListener(MouseEvent.CLICK, stopPlayback); 

function stopPlayback(event:MouseEvent):void { 
    // send login event to "AVM2toAVM1" connection 
    AVM_lc.send("AVM2toAVM1", "logIn","[email protected]" , "123123"); 

} 

function resulFunc(a:*){ 
    trace(a + " *-*-*-*-"); 
} 
AVM_lc.connect("AVM1TO"); 



// AS2 FILE - log2.swf 

var AVM_lc:LocalConnection = new LocalConnection(); 

AVM_lc.logIn = function(a , b){ 
    trace("login : " , a , " - " , b); 

} 
AVM_lc.connect("AVM2toAVM1"); 

function sendDataToAs3():Void{ 
    AVM_lc.send("AVM1TO", "resulFunc", "test value"); 
}