Просмотр полной версии : загрузка swf с помощью URLLoader
iflamberg
08.01.2013, 14:47
Вот, скажем, с помощью URLLoader у меня загружается множество разных материалов. В том чесле несколько swf. И хочу я этот swf на сцене отобразить. Как мне это сделать?
вроде должен быть код, похожий на этот, но не выходит =/
...
var loader:URLLoader = new URLLoader (new URLRequest("1.swf"));
loader.addEventListener (Event.COMPLETE, loadCompleteHandler);
...
private function loadCompleteHandler (e:Event):void {
var loader:URLLoader = e.target as URLLoader;
loader.dataFormat = URLLoaderDataFormat.BINARY;
var l:Loader = new Loader();
l.loadBytes(loader.data);
}
strangedk
08.01.2013, 15:08
Нужно подписываться на событие до того как оно может возникнуть:
var request:URLRequest = new URLRequest("1.swf");
var loader:URLLoader = new URLLoader ();
loader.addEventListener (Event.COMPLETE, loadCompleteHandler);
loader.load(request);
И кстати, а почему бы вам не грузить сразу Loader'ом, без бубнов?
gloomyBrain
08.01.2013, 15:12
вроде должен быть код, похожий на этот, но не выходит =/
А какой код есть и что именно не выходит? И кстати, убедитесь в наличии addChild(loader),так тоже бывает =)
iflamberg
08.01.2013, 15:32
2strangedk:
Что-то ты не то говоришь. Событие всегда возникает в следующем кадре, даже если грузить из локальной файловой системы, это 100%. Код всегда отработает, где бы ты не вешал слушатель, до запуска загрузки или после. В том коде, что у меня в примере, если сделать trace (loader.data); в loadCompleteHandler, то увидишь данные.
Почему бы не грузить сразу Loader'ом? Ну не знаю. Я хотел сделать что-то типа универсального загрузчика, что-то аналогичное либе BulkLoader, но свое. Грузить все подряд URLLoader'ом, а потом уже преобразовывать показалось годной идеей.
2gloomyBrain:
вот такой код, что в примере и есть. А ошибка возникает на l.loadBytes(ba); А addChild мне и не нужен. Потому что из загруженной флешки я планирую взять отдельные именованные мувики и перенести их на сцену. И, да, это работает, если заменить URLLoader обычным Loader'ом.
strangedk
08.01.2013, 15:55
2strangedk:
Что-то ты не то говоришь. Событие всегда возникает в следующем кадре, даже если грузить из локальной файловой системы, это 100%. Код всегда отработает, где бы ты не вешал слушатель, до запуска загрузки или после.
А, так. Ну ок, удачной отладки :)
А ошибка возникает на l.loadBytes(ba);
Номер и описание ошибки предлагаете устанавливать телепатически?
iflamberg
08.01.2013, 17:46
О, код ошибки. Извеняюсь. Просто подумал, что, раз некоторые гуру вроде _etc, умеют выкусывать из загруженной флешки шрифты или программно создавать MovieClip с несколькими кадрами, то моя ошибка для них должна быть очевидна.
А там "дурная" ошибка.
[Fault] exception, information=TypeError: Error #1034: Ошибка типа Coercion: невозможно преобразовать "CWSèçxœäœX“Y·¨W¡„" ¡ H‚tP@tB/‚BHè ½IS:¨ÄÐDŠF,€JUDQDTtÄ2:ãÝÁ™¿ÜSîï9÷œÿ¹÷yæ}&|ÙßþÖ^{*µ×úöŽI€Û°¦@ÂðãZ!€ÉÞÀ`c²…•\RdDT¬1úk«Bh\\Œ±–Vbb¢f¢žfôÞ-###-m]-]]
ÔB#69*Î/I#*VQa›ÜjA±{Ãb⢣äØûùGÇÇmUPø£ۤȘ¿t«éí¤©•䣥£©*Åî526ßä½—±͔ÝJÎ*Â/6TÎqotpPl,êÞ/BÎÜy“œ†œ|*
---прикоцано позже---
А, понял. Нужно было всего лишь
var l:Loader = new Loader();
l.loadBytes(loader.data);
исправить чуть-чуть
var l:Loader = new Loader();
l.loadBytes(ByteArray(loader.data));
Умение программно создавать MovieClip и получение информации из graphics не предполагают наличие телепатических способностей.
caseyryan
08.01.2013, 18:58
А так сработает?
var loader:URLLoader = new URLLoader ();
loader.dataFormat = URLLoaderDataFormat.BINARY;
loader.addEventListener (Event.COMPLETE, loadCompleteHandler);
loader.load(new URLRequest("1.swf"));
function loadCompleteHandler (e:Event):void {
var loader:URLLoader = e.target as URLLoader;
var l:Loader = new Loader();
l.loadBytes(loader.data as ByteArray);
}
GoodWin74
08.01.2013, 22:05
По теме Loader подскажите, пожалуйста. Загрузил SWF с 3 кадрами с помощью Loader и добавил на сцену. Как управлять кадрами(остановка, переход на какой то кадр и тд)?
Пробовал Loader.content.gotoAndStop(0) не получается ...
По теме Loader подскажите, пожалуйста. Загрузил SWF с 3 кадрами с помощью Loader и добавил на сцену. Как управлять кадрами(остановка, переход на какой то кадр и тд)?
Пробовал Loader.content.gotoAndStop(0) не получается ...
Попробуйте указать что loader.content это MovieClip:
var swf:MovieClip = loader.content as MovieClip;
swf.gotoAndStop(2);
GoodWin74
08.01.2013, 22:52
Попробуйте указать что loader.content это MovieClip:
var swf:MovieClip = loader.content as MovieClip;
swf.gotoAndStop(2);
Не помогает пустота на сцене :(
GoodWin74
08.01.2013, 23:00
var spTelo:Loader = new Loader();
spTelo.load(new URLRequest("http://****.swf"));
spTelo.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaded);
function onLoaded(e:Event){
addChild(spTelo);
spTelo.x=275;
spTelo.y=274;
}
Все загружается и проигрывается три кадра, а как остановить на нужном, вроде MovieClip не могу понять...
caseyryan
08.01.2013, 23:02
Для своих вопросов нужно создавать свою тему, а не лепить все в общую кучу. Здесь обсуждается другое.
GoodWin74
08.01.2013, 23:16
Тот же Loader обсуждается. Тем и так много.
Как же все таки добраться до этой SWF и управлять ей???
gloomyBrain
08.01.2013, 23:19
iflamberg, судя по ошибке, ты пытаешься загрузить строку. Смысл в том, что вот это
loader.dataFormat = URLLoaderDataFormat.BINARY;
нужно делать ДО начала загрузки, а не после. У тебя же в ошибке прямо и написано - невозможно привести строку к чему-то там (по всей видимости - к байтам). То есть ты сначала загружаешь контент, который по-умолчанию считается строкой, а потом говоришь лоадеру чтобы все что он дальше будет грузить (а он уже все загрузил!) считалось массивом байт. И получается что ты вызываешь loadBytes для строки.
iflamberg
09.01.2013, 13:37
Ребят, вы чего. Я уже решил свою проблему, в некотором смысле, благодаря подсказке г-на alatar. О чем и сообщил в добавлении к посту номер 7, чтобы не плодить посты.
2GoodWin74: У меня есть ощущение, что ты пытаешься управлять мувиком, до того, как он загрузился, до события COMPLETE. Нет?
strangedk
09.01.2013, 16:02
var spTelo:Loader = new Loader();
spTelo.load(new URLRequest("http://****.swf"));
spTelo.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaded);
Да кто же вас учил сначала загружать, а потом подписываться на событие? :)
В данном случае, это не имеет принципиального значения. Это событие, в любом случае, произойдет после выхода из метода.
strangedk
09.01.2013, 17:01
Я понимаю что пример может и не совсем правильный. Но в любом случае время не должно влиять.
public function loadme():void {
var spTelo:Loader = new Loader();
spTelo.load(new URLRequest("http://www.hsharma.com/_assets2011/images/logo.png"));
var pause:uint = setTimeout(function() {
clearTimeout(pause);
spTelo.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaded);
}, 500);
}
private function onLoaded(e:Event):void {
trace("loaded"); // Не выполнится
}
iflamberg
09.01.2013, 17:13
Щас. Как это не должно влиять! Ведь ты создал новую функцию, которая выполнится по таймеру, т.е., скажем, в следующем кадре. Т.е. в данном случае, очевидно, что ты вешаешь слушатель, когда данные уже могут быть загружены. Кстати, такие функции не рекомендуется создавать, их потом garbage collector плохо кушает. Да и setTimout вроде как "deprecated".
Такие вещи элементарно трейсятся дебаггером в любом случае. Вот покажи мне пример, где ты вешаешь слушатель в одном теле функции с loader.load и он не срабатывает, тогда с меня пиво.
strangedk
09.01.2013, 17:29
А при чем здесь кадры? Если картинка будет грузиться больше чем пол секунды - то в моем примере обработчик сработает. А я говорю что это недопустимо, когда время загрузки может решать поведение слушателя.
Я не утверждаю что в вашем примере это не сработает, я говорю что это вообще плохой тон, загружать что либо, а потом подписываться на событие. Вы просто еще не попадали в ситуации когда это важно.
Кстати, такие функции не рекомендуется создавать, их потом garbage collector плохо кушает. Да и setTimout вроде как "deprecated".
Ни о чем. setTimeout внутри сразу же очищается clearTimeout'ом
iflamberg
09.01.2013, 17:47
Я не утверждаю что в вашем примере это не сработает, я говорю что это вообще плохой тон, загружать что либо, а потом подписываться на событие. Вы просто еще не попадали в ситуации когда это важно.
Я утверждаю, что если ты подписываешься на событие в том же теле функции, что и создаешь загрузчик, то не важно, запустил и подписался, или подписался и запустил. Даже если грузишь локально. В любом случае, событие будет сгенерированно только после выхода из тела функции. Это логично и отчетливо видно при дебаге.
Ни о чем. setTimeout внутри сразу же очищается clearTimeout'ом
Угу, угу. Создай в цикле тысячу таких функций, подожди пол секунды, пока они выполнятся, открой профайлер. У тебя в памяти будет висеть тысяча динамически сгенерированных функций, с которыми мусорщик не знает что делать.
Ну, в общем, не важно =) Давай закроем офтоп, а то у меня и второго аватара здесь забанят, традиция возникнет, банить меня каждых четыре года =)
GoodWin74
09.01.2013, 18:25
Уууу) в итоге кто в курсе как быть с Loader'ом?
Я уже все перепробовал что находил в интернете:
var spTelo:Loader = new Loader();
spTelo.load(new URLRequest("http://****.swf"));
spTelo.contentLoaderInfo.addEventListener(Event.COMPLETE, onLoaded);
function onLoaded(e:Event){
addChild(spTelo);
spTelo.x=275;
spTelo.y=274;
MovieClip(spTelo.content).gotoAndStop(0) // и MovieClip(spTelo.contentLoaderInfo.content).gotoAndStop(0) пробовал
}
Все грузится но строчка с остановкой кадра игнорируется и кадры просто бегают как и без неё :(
Тоже посоветовали но опять игнорируется gotoAndStop
addChild(loader);
var loadedClip:MovieClip = loader.content as MovieClip;
loadedClip.gotoAndStop(3)
strangedk
09.01.2013, 18:26
Я думаю дело в том, что нулевого кадра не существует. Кадры начинаются с 1-го
(а просто stop() не работает тоже?)
Добавлено через 5 минут
кстати, а зачем вы добавляете сам лоадер? может есть резон добавить его content as MovieClip ?
GoodWin74
09.01.2013, 18:56
я уже все 3 кадра пробовал)
Попробовал Stop() тоже без успешно.
Попробовал добавить мувиклип на сцену, но он не добавляется либо просто пустой добавляется так как его не видно.
var loadedClip:MovieClip = spTelo.content as MovieClip;
addChild(loadedClip);
loadedClip.stop();
loadedClip.x=100;
loadedClip.y=100;
iflamberg
09.01.2013, 19:03
Гудвин, рекомендую создать новую тему, пока уважаемые модераторы не заворчали.
По теме. Слушай, так мувик при добавлении на сцену отображается или не отображается? Если не отображается, то с чего ты решил, что он загружен? Может там IOError возникает или ошибки политики безопасности. В чем ты работаешь? Прямо в Flash IDE? Где лежит загружаемый мувик? Локально? Удаленно? может быть у тебя в загруженный мувик останавливается, а внутри него вложенный мувик продолжает движение? Короче, всю флешку в студию. Или выкоцанный кусок, который не работает.
GoodWin74
09.01.2013, 19:08
Loader грузит в том то и дело. И флешка появляется и воспроизводится а вот управлять я ей все не как не могу :(
Она без конца циклически проигрывается
iflamberg
09.01.2013, 19:15
Точно в загружаемом ролике нет вложенных клипов, которые естественно не останавливаются на stop()?
В загружаемой флешке кода нет?
Короче говоря. Приведенный вами код должен работать. Если не работает, то никакая телепатия не поможет понять что там у вас не так. Присылайте пациента. Только пожалейте нас, уберите все что не относится к проблеме.
strangedk
09.01.2013, 19:19
я уже все 3 кадра пробовал)
Попробовал Stop() тоже без успешно.
Попробовал добавить мувиклип на сцену, но он не добавляется либо просто пустой добавляется так как его не видно.
var loadedClip:MovieClip = spTelo.content as MovieClip;
addChild(loadedClip);
loadedClip.stop();
loadedClip.x=100;
loadedClip.y=100;
Ну если он не добавляется так, то как вы можете управлять им?
Может там еще какой уровень вложенности?
GoodWin74
09.01.2013, 21:16
Да нет флешка обычная. Состоит из 3 кадров на каждом кадре 1 мувиклип.
Сейчас оставлю только то что нужно и прикреплю проект.
Прикрепил 1ое - Основная флешка, 2ая подгружаемая
GoodWin74
09.01.2013, 22:12
уже все перепробовал даже в тестовом не хочет останавливаться.
GoodWin74
10.01.2013, 00:28
Как так? Даже не меняли нечего?:eek:
У меня Flash Player 10 самый обыкновенный. Как такое может быть???
Ничего не менял.
Попробуйте почистить КЭШ, зайти с другого браузера, компьютера.
GoodWin74
10.01.2013, 01:07
Я загружаю её через плеер флеш родной с адоб(Не через браузер). Я даже теперь еще больше запутался в чем вина.:confused:
Поставил сейчас Adobe Flash Player 11 все то же самое :(
Добавлено через 28 минут
может настройки компиляции другие?
Пробовал кстати в опере но там такая же картина ...
iflamberg
10.01.2013, 15:05
Ахаха, Гудвин. Тебе прийдется разобраться с политиками безопасности adobe.
Итак. Смотрим. У тебя в indexTest.fla, в том виде, что ты прислал, открывается не локальный telo.swf. У тебя открывается файл по адресу http://cs6156.userapi.com/u155797056/9b807237a5b58c.zip, который на самом деле тот же telo.swf, но переименованный. Нестрашно, loader его распознает как мувик и отображает на сцене.
Так, теперь. Если я компилирую indexTest.fla в флеше, то мувик открывается, загружается http://cs6156.userapi.com/u155797056/9b807237a5b58c.zip и останавливается в 1ом кадре. Все ок.
Но. Если я теперь запущу indexText.swf из файловой системы, то мувик загрузится, но в 1ом кадре не остановится.
Это происходит по той причине, что мешает политика безопасности. Мувик-загрузчик находится в одном домене - вашей локальной машине, а загружаемый мувик - в другом домене. Это означает, что мувик можно загрузить, но управлять им нельзя. Так же нельзя будет, например, скопировать мувик в BitmapData. Почему же в flash ide мувик отобразился как надо? Да потому, что в нем дебаг-плеер настроен так, чтобы игнорировать политики безопасности для удобства отладки.
Так что если выложить indexTest.swf по тому же адресу http://cs6156.userapi.com/u155797056/, где лежит и загружаемый ролик, то все откроется как надо. Теперь, если у тебя нет возможности разместить и то и то по одному адресу. Тогда нужно по адресу загружаемой флешки размещать crossdomain.xml, разрешающий ее использование и использовать параметр ContextLoader в loader.load. Вот большая статья на тему http://www.senocular.com/flash/tutorials/contentdomains/
А если у тебя обе флешки, наоборот, должны оба открываться локально, скажем на машине клиента, то тогда совсем другая история. Тогда нужно выставлять параметр компилятора local playback security в access only local, искать в file->publish settings->publish swf->advanced.
Это происходит по той причине, что мешает политика безопасности. Мувик-загрузчик находится в одном домене - вашей локальной машине, а загружаемый мувик - в другом домене. Это означает, что мувик можно загрузить, но управлять им нельзя.
Компилируйте с флагом access network only.
iflamberg
10.01.2013, 17:50
Так и компилируется. Это не избавляет от проблемы. Из ide загружает удаленный мувик и переходит в кадр. Из системы если запустить - нет.
Вот у меня по http://iflamberg.net/tmp/indexTest.swf лежит мувик, который загружает http://iflamberg.net/tmp/indexTest.swf. Все оки. Если сохранить этот ролик indexTest.swf на машину и открыть, то мувик загрузит, но на кадр переходить откажется. Вот что смущает, так это то, что даже ошибку не выведет.
GoodWin74
10.01.2013, 18:02
Все получилось! Спасибо всем.
Вообщем в загружаемой флешки "telo.fla", создал слой просто и прописал в кадр длиной с весь ролик
import flash.system.*;
Security.allowDomain("*");
И все заработало :)
Еще раз всем спасибо кто откликнулся!!!:)
Ну так разрешите в loadee откуда можно делать кросскриптинг путем вызова Security.allowDomain();
Добавлено через 1 минуту
Поздно написал.
GoodWin74
10.01.2013, 19:02
Все равно спасибо :)
iflamberg
10.01.2013, 19:13
Так это надо добавлять Security.allowDomain("*") в каждый загружаемый мувик, так ведь? Не самый правильный способ. А правильный был бы, по идее, добавить в папку к мувикам crossdomain.xml, типа такого:
<?xml version="1.0"?>
<cross-domain-policy>
<allow-access-from domain="*"/>
</cross-domain-policy>
И загрузкой мувика таким образом:
spTelo.load(new URLRequest("http://iflamberg.net/tmp/telo.swf"),new LoaderContext(true,ApplicationDomain.currentDomain,SecurityDomain.currentDomain));
но тогда при компиляции он ругается "SecurityError: Error #2142: Нарушение изолированной среды: локальные SWF-файлы не могут использовать свойство LoaderContext.securityDomain." Я сам совсем запутался =)
Это совершенно разные вещи.
GoodWin74
11.01.2013, 01:47
Не совсем представляю как я кроссдомаин кину на серв Вконтакте :))
По мне легче добавить во флеш две строчки :)
iflamberg
11.01.2013, 13:59
Котяр, а немного раскрыть тему, а?
Security.allowDomain - разрешает вызывать скрипты для swf файлов из указанных доменов.
crossdomain.xml - описывает правила загрузки и доступа к содержимому swf и прочих ресурсов, лежащих на этом же сервере.
iflamberg
11.01.2013, 17:59
Окей, так как разрешить вызывать скрипты для swf файлов из чужих доменов, не прописывая две строчки в каждой флешке?
Никак. Хозяин флэшек должен разрешить, т.е. прописать Security.allowDomain.
Адоби такие вот параноики.
GoodWin74
12.01.2013, 02:27
По сути правильно, подгружать зато не будут те кому не надо :)
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.