从AS3容器调用AS2功能

时间:2011-11-09 12:08:31

标签: flash actionscript-3 actionscript-2 communication

我正在尝试从AS3 container调用一个函数,该函数应该调用无法编辑的旧AS2 SWF,因为我们正在讨论1000个swf文件,确实存在一些调用内部函数的方法来自AS2 SWF的<{1}}?

我知道一种可能的方法是将AS3 container添加为written here,但正如我所说,我无法编辑所有swf文件,因此我只是想知道是否存在替代方案。

3 个答案:

答案 0 :(得分: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文件中的一个。它在它的根上定义了我们想要在加载时访问的函数:

stop();

function playMovie() {
    play();
}

parent_as2.swf - 包含用于在AVM1和AVM2运行时之间桥接的LocalConnection代码的中间AS2文件。由于上面提到的事件问题,这将轮询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);
}

答案 1 :(得分:0)

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

答案 2 :(得分: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","test@test.com" , "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");
}