|
|
|||||
[+1 09.03.11]
Регистрация: Mar 2010
Сообщений: 128
|
доступ к stage из загружаемой swf
есть Loader он загружает swf из байт кода, в загружаемой swf есть операторы такого план stage.scaleMode = StageScaleMode.NO_SCALE;(судя по декомпилици flash builder'a), на этих операторах возникает ошибка,
что надо прописать чтоб таких ошибок не возникало? читал про политику безопасности не нашел ответ. как я понял надо ковырять Security.ApplicationDomain Помогите пожалуйста. |
|
|||||
ну по идее писать надо в самой флешке хендлер с проверкой на наличие дисплей листа. а так...
if (stage) init(); else addEventListener(Event.ADDED_TO_STAGE, init); } //- PUBLIC & INTERNAL METHODS ----------------------------------------------------------------------------- //- PRIVATE & PROTECTED METHODS --------------------------------------------------------------------------- private function init(e:Event = null):void { removeEventListener(Event.ADDED_TO_STAGE, init); // entry point stage.scaleMode = StageScaleMode.NO_SCALE; stage.align = StageAlign.TOP_LEFT; |
|
|||||
[+1 09.03.11]
Регистрация: Mar 2010
Сообщений: 128
|
Загружаемую swf не могу менять, они могут быть разные.
По архитектуре флеша stage в загружаемой флешки будет равен stage флешки которая грузит, просто надо открыть доступ. загружаемые флешки на 100% без ошибок. так я загружаю package { import flash.display.Loader; import flash.display.Sprite; import flash.events.Event; import flash.events.ProgressEvent; import flash.net.URLRequest; import flash.net.URLStream; import flash.system.ApplicationDomain; import flash.system.LoaderContext; import flash.system.Security; import flash.text.TextField; import flash.utils.ByteArray; public class LoaderGame extends Sprite { private var byteLoader:URLStream= new URLStream(); private var loader:Loader = new Loader(); private var file:ByteArray = new ByteArray; private var key:Array = new Array; private var text_progress:TextField = new TextField; public function LoaderGame() { Security.allowDomain("*"); Security.allowInsecureDomain("*"); this.addEventListener(Event.ADDED_TO_STAGE,init); } private function init(e:Event):void { var url:URLRequest = new URLRequest("Engineer.swf"); byteLoader.load(url); byteLoader.addEventListener(Event.COMPLETE,onByteComplete); this.addChild(text_progress); byteLoader.addEventListener(ProgressEvent.PROGRESS,onProgress); } private function onProgress(e:ProgressEvent):void { text_progress.text=e.bytesLoaded.toString()+"/"+e.bytesTotal.toString()+"\n"+int((e.bytesLoaded/e.bytesTotal*100)).toString(); } private function onByteComplete(e:Event):void { file=расшифрованный байт код; var loaderContex:LoaderContext = new LoaderContext(); loaderContex.applicationDomain=здесь надо что-то хитрое вписать. loader.loadBytes(file,loaderContex); this.addChild(loader); this.removeChild(text_progress); } } } Оказалась что к stage нельзя получить доступ [Frame(factoryClass="MyClass")] из MyClass -странно. |
|
|||||
Расскажу я вам страшную историю. Это невозможно. Я очень детально исследовал эту проблему. Stage будет доступен в подгружаемой флешке но после того как отработают конструкторы документ класса и классов, объекты которых лежат на первом фрейме. Если в коде конструктора любого из них имеется обращение к stage то подгрузить такую флешку невозможно, т.к. на этапе вызова конструктора stage не определён. Когда же мы запускаем эту флешку отдельно то флешплеер магическим образом делает stage доступным в конструкторе. Это костыль но с этим поделать практически ничего не возможно, разве что а байткоде переписывать код конструктора. Погуляйте по ссылкам: http://www.flasher.ru/forum/showthread.php?t=141350 http://groups.google.com/group/rufla...d1ff4167?pli=1
|
|
|||||
Цитата:
Цитата:
__________________
...вселенская грусть |
|
|||||
Может криво выразился, но примерно это и хотел сказать. Да стейдж доступен но не в конструкторах.
Касательно решения Valyard, я с ним разговаривал и его исходники изучал. Вопервых оно сервер-сайд, во вторых если сделать наследование и документ-классом будет наследник, который вызывает конструктор предка явно и с параметрами это решение не работает. Далее если на первом кадре таймлинии лежат объекты и в их конструкторах тоже идёт обращение к stage то это тоже не будет работать. Что интересно когда флешка пробегает всю таймлинию и начинается с начала то там уже стейдж доступен. Адекватных и везде работающих решений пока нет. Добавлено через 6 минут Да, естественно если флешка не добавлена на сцену то доступк к стейдру крашится, это по дефолту. Я имею ввиду что если её добавлять на сцену сразу при загрузке, то там только вопрос работы конструкторов. Добавлено через 38 минут ещё багу в решении Valyard вспомнил. Если в конструкторе написано без проверки на существование стейджа, то в стенд элон запуске стейдж уже есть но несмотря на это после регистрации этого ивент лисенена ему придёт событие что он добавлен на стейдж. Так вот код Valyard заталкивает код конструктора в ивент лисенер, и если там зарегистрировать ещё одного то ему уже это событие не придёт. Много там косяков разного плана. |
Часовой пояс GMT +4, время: 11:04. |
|
« Предыдущая тема | Следующая тема » |
Теги |
loader , stage |
|
|