Вызов функции AS2 из контейнера AS3 - PullRequest
0 голосов
/ 09 ноября 2011

Я пытаюсь вызвать функцию из AS3 container, которая должна вызывать старый AS2 SWF, который не может быть отредактирован, потому что мы говорим о 1000 SWF-файлах, существует ли какой-то способ вызова функции внутри AS2 SWF изAS3 container?

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

Ответы [ 3 ]

3 голосов
/ 09 ноября 2011

Если ваш контейнер обязательно должен быть записан в AS3, то вы можете создать другой промежуточный контейнер в AS2, который может напрямую взаимодействовать с 1000 существующими SWF-файлами, и затем вы можете связываться с ним, используя метод LocalConnection.

Приведенный ниже код является простым примером этого, но из-за проблемы с MovieClipLoader, по-видимому, не запускающей события при загрузке в объект AS3 AVM1, мне пришлось реализовать довольно уродливую систему опроса.Вопрос, относящийся к этой проблеме, можно найти здесь: Почему события MovieClipLoader не запускаются при загрузке в оболочку AS3? .

child_as2.swf - Один изтысяча файлов AS2, которые мы пытаемся загрузить.В корне определены функции, к которым мы хотим получить доступ при загрузке:

stop();

function playMovie() {
    play();
}

parent_as2.swf - Промежуточный файл AS2, содержащий код LocalConnection для соединения между AVM1 иВремя выполнения AVM2.Из-за проблемы событий, отмеченной выше, этот опрос 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 голосов
/ 10 ноября 2011

Вы можете сделать 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");
}
0 голосов
/ 09 ноября 2011

Я не завидую этой ситуации один бит. Единственное предложение, которое у меня есть, - это декомпилировать… 1000 SWF-файлов и реализовать там логику LocalConnection, возможно, в общем SWC-файле, если он правильно спроектирован, перекомпилировать SWF-файлы и перейти оттуда.

...