Пытаясь ответить на этот вопрос: Вызов функции AS2 из контейнера AS3 Я наткнулся на контрольно-пропускной пункт.Настройка представляет собой AS3 SWF, который загружает AS2 SWF, который, в свою очередь, загружает другой AS2 SWF.Связь между SWF AS3 и родительским SWF AS2 осуществляется с помощью localConnection.
child_as2.swf - это очень простая анимация временной шкалы перемещения блока по экрану со следующим кодом накадр 1:
stop();
function playMovie() {
play();
}
parent_as2.swf - это промежуточный контейнер AS2, который загружается в child_as2.swf.Загрузка инициируется вызовом LocalConnection:
import mx.utils.Delegate;
this._lockroot = true;
var container:MovieClip = createEmptyMovieClip("container", 10);
//mustn't cast this or the Delegate breaks
var mcLoader = new MovieClipLoader();
mcLoader._lockroot = true;
mcLoader.onLoadInit = Delegate.create(this,onMCLoadInit);
function onMCLoadInit() {
trace("load init");
container.playMovie();
}
//LocalConnection code
var myLC:LocalConnection = new LocalConnection();
myLC.loadChild = function(){
mcLoader.loadClip("child_as2.swf", container);
trace("loading");
}
myLC.connect("AVM");
parent_as3.swf - это внешняя оболочка, написанная на AS3.Он загружает parent_as2.swf и связывается с ним через 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);
}
Проблема заключается в том, что функция onMCLoadInit
в parent_as2 никогда не вызывается, когда она загружается в оболочку AS3, хотя загрузка действительно занимаетместо.События также терпят неудачу при использовании объекта слушателя вместо Делегата.Коробка из child_as2.swf видна, но никогда не начинает двигаться.Однако, если я запускаю parent_as2.swf сам по себе и запускаю загрузку без LocalConnection, все работает нормально.Он также работает правильно при запуске из внешнего вызова LocalConnection.Почему оболочка AS3 предотвращает запуск событий MovieClipLoader?
Обновление:
Так что, принимая во внимание, что из MovieClipLoader в parent_as2.swf нельзя запускать события, я изменил код для обнаруженияСостояние loadInit путем комбинации опроса MovieClipLoader.getProgress()
и наличия функции в child_as2.swf.Это не красиво, но, кажется, работает.Я все же предпочел бы предложить решение с использованием событий.
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");