我試圖從AS3 container
調用一個函數,該函數應該調用舊的AS2 SWF
,這是無法編輯的因爲我們正在談論1000個swf文件,確實存在某種方式來調用函數內部來自AS3 container
的AS2 SWF
?從AS3容器調用AS2函數
我知道一個可能的方法,通過添加LocalConnection
作爲written here,但正如我所說我不能編輯所有的SWF文件,所以我只是想知道是否存在一些替代。
我試圖從AS3 container
調用一個函數,該函數應該調用舊的AS2 SWF
,這是無法編輯的因爲我們正在談論1000個swf文件,確實存在某種方式來調用函數內部來自AS3 container
的AS2 SWF
?從AS3容器調用AS2函數
我知道一個可能的方法,通過添加LocalConnection
作爲written here,但正如我所說我不能編輯所有的SWF文件,所以我只是想知道是否存在一些替代。
我不羨慕這種情況一點。我唯一的建議是反編譯... 1000個SWF並在那裏實現LocalConnection邏輯,如果架構正確,可能在共享SWC中,重新編譯SWF並從那裏開始。
如果您的容器絕對必須用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);
}
如果AS2 SWF的軍隊沒有LocalConnection設置,那麼通信如何完成AS2-> AS2? – Aaron
這可能是一個解決方案,我會盡快看看! – vitto
@vitto - 我已經開始自己測試它,並遇到中間容器中的MovieClipLoader事件問題。可能是一個交易破壞者... – shanethehat
你可以使一個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");
}
您是否嘗試將AS2 swf文件作爲網橋,並使用LocalConnection。 – ymutlu