PDA

Просмотр полной версии : загрузка 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%. Код всегда отработает, где бы ты не вешал слушатель, до запуска загрузки или после.
А, так. Ну ок, удачной отладки :)

alatar
08.01.2013, 16:05
А ошибка возникает на 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));

alatar
08.01.2013, 17:58
Умение программно создавать 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) не получается ...

TWETTI
08.01.2013, 22:37
По теме 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);
Не помогает пустота на сцене :(

TWETTI
08.01.2013, 22:55
Покажите ваши fla файлы.

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);



Да кто же вас учил сначала загружать, а потом подписываться на событие? :)

alatar
09.01.2013, 16:07
В данном случае, это не имеет принципиального значения. Это событие, в любом случае, произойдет после выхода из метода.

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
уже все перепробовал даже в тестовом не хочет останавливаться.

TWETTI
09.01.2013, 23:28
У меня все работает.

GoodWin74
10.01.2013, 00:28
Как так? Даже не меняли нечего?:eek:
У меня Flash Player 10 самый обыкновенный. Как такое может быть???

TWETTI
10.01.2013, 00:42
Ничего не менял.
Попробуйте почистить КЭШ, зайти с другого браузера, компьютера.

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.

dimarik
10.01.2013, 17:36
Это происходит по той причине, что мешает политика безопасности. Мувик-загрузчик находится в одном домене - вашей локальной машине, а загружаемый мувик - в другом домене. Это означает, что мувик можно загрузить, но управлять им нельзя.

Компилируйте с флагом 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("*");

И все заработало :)

Еще раз всем спасибо кто откликнулся!!!:)

dimarik
10.01.2013, 18:22
Ну так разрешите в 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." Я сам совсем запутался =)

Котяра
11.01.2013, 01:03
Это совершенно разные вещи.

GoodWin74
11.01.2013, 01:47
Не совсем представляю как я кроссдомаин кину на серв Вконтакте :))
По мне легче добавить во флеш две строчки :)

iflamberg
11.01.2013, 13:59
Котяр, а немного раскрыть тему, а?

Котяра
11.01.2013, 17:39
Security.allowDomain - разрешает вызывать скрипты для swf файлов из указанных доменов.
crossdomain.xml - описывает правила загрузки и доступа к содержимому swf и прочих ресурсов, лежащих на этом же сервере.

iflamberg
11.01.2013, 17:59
Окей, так как разрешить вызывать скрипты для swf файлов из чужих доменов, не прописывая две строчки в каждой флешке?

Котяра
12.01.2013, 02:20
Никак. Хозяин флэшек должен разрешить, т.е. прописать Security.allowDomain.
Адоби такие вот параноики.

GoodWin74
12.01.2013, 02:27
По сути правильно, подгружать зато не будут те кому не надо :)