Если ваш контейнер обязательно должен быть записан в 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);
}