Просмотр полной версии : Loader и внешний SWF
Limeflash
09.12.2009, 03:12
Задача на первый взгляд проста - создать прелоадер, который загружал бы произвольную флешку, в конкретном случае - простой видеоплеер.
Код в целом прост:
var context:LoaderContext = new LoaderContext();
context.checkPolicyFile = true;
var ldr:Loader= new Loader();
ldr.load( new URLRequest( "путь до swf-файла" ), context );
Обычные картинки, простые флешки, например баннеры, созданные в AS2, грузятся и работают прекрасно. Но как только доходит до загрузки AS3-флешки, дебаг-плеер начинает сыпать ошибками, что мол "Error #1009: Не удается вызвать свойство или метод со ссылкой на объект 'null'"
В чем грабля?
bicubic_bublic
09.12.2009, 03:13
В чем грабля?
код загружаемыой флешки с ошибкой написан..
Limeflash
09.12.2009, 03:17
код загружаемыой флешки с ошибкой написан..
Скорее нет, чем да, ведь сама по себе (отдельно от загрузчика) загружаемая флешка работает прекрасно.
bicubic_bublic
09.12.2009, 03:36
Скорее нет, чем да, ведь сама по себе (отдельно от загрузчика) загружаемая флешка работает прекрасно.
это ни о чем не говорит.
для начала проверьте ссылки на stage при инициализации загружаемой флешки. в конструкторе их быть не должно.
Limeflash
09.12.2009, 03:39
я флешка работает прекрасно.
это ни о чем не говорит.
для начала проверьте ссылки на stage при инициализации загружаемой флешки. в конструкторе их быть не должно.[/QUOTE]
Ссылки, пожалуй есть, и скорее всего будут, ведь флешка произвольная, и каждый раз может быть разной, я на нее влиять не могу.
Если дело связано как-то с безопасностью - могу уточнить, что обе флешки находятся на одном и том же сервере, и есть всеразрешающий crossdomain.xml
bicubic_bublic
09.12.2009, 03:41
тогда попробуйте загружать таким образом:
var loader:Loader= new Loader();
addChild(loader);
loader.load( new URLRequest( "путь до swf-файла" ), context );
Limeflash
09.12.2009, 03:45
тогда попробуйте загружать таким образом:
var loader:Loader= new Loader();
addChild(loader);
loader.load( new URLRequest( "путь до swf-файла" ), context );
Пробовал так, пробовал this.stage.addChild(ldr), пробовал вообще убрать addChild, ошибка все равно возникает точно такая же во всех случаях.
bicubic_bublic
09.12.2009, 03:50
ну можно попробовать декомпилировать проблемные флешки и выяснить в чем проблема..
возможно где-то есть обращение к root которое считается внутреннее а получается не очень..
Limeflash
09.12.2009, 04:00
ну можно попробовать декомпилировать проблемные флешки и выяснить в чем проблема..
возможно где-то есть обращение к root которое считается внутреннее а получается не очень..
Декомпилировать можно, и скорее всего они есть, эти обращения, ведь изначально флешки не писались под использование в прелоадере, а теперь их надо использовать в прелоадере.
Пока не будет глобального обработчика ошибок - ничего вы с этим не сможете сделать... исправить чужую криворукость в уже скомпилированом коде - это Левшой надо быть...
bicubic_bublic
09.12.2009, 04:05
есть еще совет, вдруг поможет
Security.allowDomain('*');
Limeflash
09.12.2009, 04:09
Пока не будет глобального обработчика ошибок - ничего вы с этим не сможете сделать... исправить чужую криворукость в уже скомпилированом коде - это Левшой надо быть...
Да, но мне кажется, что мы не упираемся в данном случае в чужую криворукость, мне кажется что мне например не хватает практических знаний, чтобы суметь запустить любую произвольную флешку внутри контейнера в своей флешке-прелоадере.
Неужели нет такого способа? Помнится, в втором AS был _lockroot, он в таких случаях помогал.
Добавлено через 50 секунд
есть еще совет, вдруг поможет
Security.allowDomain('*');
Да, это есть, не помогает :)
>> Неужели нет такого способа? Помнится, в втором AS был _lockroot, он в таких случаях помогал.
Тут проблема не в этом - если кто-то обратился к методам / свойствам стейджа (рута, или лоадерИнфо) до того, как он был доступен - то этому уже никак не помочь. Только на уровне байткода править. Я могу ошибаться в деталях, но смысл примерно такой: помещенные на таймлайн объекты (в том числе и документ класс) создаются как бы в 2 этапа - сначала создается символ, потом линкуется к стейджу а потом вызывается его конструктор, а когда мы загружаем флешку, то первый этап не происходит.
Т.е. в AS2 можно было сделать Object.registerClass() - ну, вот что-то, по всей видимости похожее происходит и там. В HaXe например есть штатная возможность создать объект не вызывая его конструктора - поэтому, я думаю, что такая возможность в принципе существует в AVMPlus - просто средствами AS3 мы никак до нее не доберемся.
И как бы с этим делать пока вобщем-то нечего, уже много об этом писали, вот в 10.1 пообещали сделать глобальный обработчик ошибок - но пока не работает :)
Limeflash
09.12.2009, 14:43
wvxvw, ну вот, вроде бы проясняться стало :) большое спасибо :)
значит и если флешка (в которой обращение к стейджу раньше положенного) заембеддена в мою флешку - она тоже работать не будет?
Неа, только если сделаете ее документ класс классом-фабрикой дополнительного кадра (я такое не пробовал, может сработает, а может и нет, но по идее может получится).
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.