Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   загрузка swf с помощью URLLoader (http://www.flasher.ru/forum/showthread.php?t=191939)

iflamberg 08.01.2013 14:47

загрузка swf с помощью URLLoader
 
Вот, скажем, с помощью URLLoader у меня загружается множество разных материалов. В том чесле несколько swf. И хочу я этот swf на сцене отобразить. Как мне это сделать?

вроде должен быть код, похожий на этот, но не выходит =/
Код AS3:

...
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

Нужно подписываться на событие до того как оно может возникнуть:

Код AS3:

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

Цитата:

Сообщение от iflamberg (Сообщение 1114261)
2strangedk:
Что-то ты не то говоришь. Событие всегда возникает в следующем кадре, даже если грузить из локальной файловой системы, это 100%. Код всегда отработает, где бы ты не вешал слушатель, до запуска загрузки или после.

А, так. Ну ок, удачной отладки :)

alatar 08.01.2013 16:05

Цитата:

Сообщение от iflamberg (Сообщение 1114261)
А ошибка возникает на 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“œ†œ|*
---прикоцано позже---
А, понял. Нужно было всего лишь
Код AS3:

                        var l:Loader = new Loader();
                        l.loadBytes(loader.data);

исправить чуть-чуть
Код AS3:

                        var l:Loader = new Loader();
                        l.loadBytes(ByteArray(loader.data));


alatar 08.01.2013 17:58

Умение программно создавать MovieClip и получение информации из graphics не предполагают наличие телепатических способностей.

caseyryan 08.01.2013 18:58

А так сработает?
Код AS3:

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

Цитата:

Сообщение от GoodWin74 (Сообщение 1114401)
По теме Loader подскажите, пожалуйста. Загрузил SWF с 3 кадрами с помощью Loader и добавил на сцену. Как управлять кадрами(остановка, переход на какой то кадр и тд)?
Пробовал Loader.content.gotoAndStop(0) не получается ...

Попробуйте указать что loader.content это MovieClip:
Код AS3:

var swf:MovieClip = loader.content as MovieClip;
swf.gotoAndStop(2);


GoodWin74 08.01.2013 22:52

Цитата:

Сообщение от TWETTI (Сообщение 1114404)
Попробуйте указать что loader.content это MovieClip:
Код AS3:

var swf:MovieClip = loader.content as MovieClip;
swf.gotoAndStop(2);


Не помогает пустота на сцене :(

TWETTI 08.01.2013 22:55

Покажите ваши fla файлы.

GoodWin74 08.01.2013 23:00

Код AS3:

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

Цитата:

Сообщение от GoodWin74 (Сообщение 1114411)
Код AS3:

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

Я понимаю что пример может и не совсем правильный. Но в любом случае время не должно влиять.

Код AS3:

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

А при чем здесь кадры? Если картинка будет грузиться больше чем пол секунды - то в моем примере обработчик сработает. А я говорю что это недопустимо, когда время загрузки может решать поведение слушателя.

Я не утверждаю что в вашем примере это не сработает, я говорю что это вообще плохой тон, загружать что либо, а потом подписываться на событие. Вы просто еще не попадали в ситуации когда это важно.

Цитата:

Сообщение от iflamberg (Сообщение 1114622)
Кстати, такие функции не рекомендуется создавать, их потом garbage collector плохо кушает. Да и setTimout вроде как "deprecated".

Ни о чем. setTimeout внутри сразу же очищается clearTimeout'ом

iflamberg 09.01.2013 17:47

Цитата:

Я не утверждаю что в вашем примере это не сработает, я говорю что это вообще плохой тон, загружать что либо, а потом подписываться на событие. Вы просто еще не попадали в ситуации когда это важно.
Я утверждаю, что если ты подписываешься на событие в том же теле функции, что и создаешь загрузчик, то не важно, запустил и подписался, или подписался и запустил. Даже если грузишь локально. В любом случае, событие будет сгенерированно только после выхода из тела функции. Это логично и отчетливо видно при дебаге.

Цитата:

Ни о чем. setTimeout внутри сразу же очищается clearTimeout'ом
Угу, угу. Создай в цикле тысячу таких функций, подожди пол секунды, пока они выполнятся, открой профайлер. У тебя в памяти будет висеть тысяча динамически сгенерированных функций, с которыми мусорщик не знает что делать.

Ну, в общем, не важно =) Давай закроем офтоп, а то у меня и второго аватара здесь забанят, традиция возникнет, банить меня каждых четыре года =)

GoodWin74 09.01.2013 18:25

Уууу) в итоге кто в курсе как быть с Loader'ом?

Я уже все перепробовал что находил в интернете:

Код AS3:

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
Код AS3:

        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() тоже без успешно.

Попробовал добавить мувиклип на сцену, но он не добавляется либо просто пустой добавляется так как его не видно.
Код AS3:

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

Цитата:

Сообщение от GoodWin74 (Сообщение 1114646)
я уже все 3 кадра пробовал)

Попробовал Stop() тоже без успешно.

Попробовал добавить мувиклип на сцену, но он не добавляется либо просто пустой добавляется так как его не видно.
Код AS3:

var loadedClip:MovieClip = spTelo.content as MovieClip;
addChild(loadedClip);
loadedClip.stop();
loadedClip.x=100;
loadedClip.y=100;


Ну если он не добавляется так, то как вы можете управлять им?
Может там еще какой уровень вложенности?

GoodWin74 09.01.2013 21:16

Вложений: 2
Да нет флешка обычная. Состоит из 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/tutor...ontentdomains/

А если у тебя обе флешки, наоборот, должны оба открываться локально, скажем на машине клиента, то тогда совсем другая история. Тогда нужно выставлять параметр компилятора local playback security в access only local, искать в file->publish settings->publish swf->advanced.

dimarik 10.01.2013 17:36

Цитата:

Сообщение от iflamberg (Сообщение 1114887)
Это происходит по той причине, что мешает политика безопасности. Мувик-загрузчик находится в одном домене - вашей локальной машине, а загружаемый мувик - в другом домене. Это означает, что мувик можно загрузить, но управлять им нельзя.

Компилируйте с флагом access network only.

iflamberg 10.01.2013 17:50

Так и компилируется. Это не избавляет от проблемы. Из ide загружает удаленный мувик и переходит в кадр. Из системы если запустить - нет.
Вот у меня по http://iflamberg.net/tmp/indexTest.swf лежит мувик, который загружает http://iflamberg.net/tmp/indexTest.swf. Все оки. Если сохранить этот ролик indexTest.swf на машину и открыть, то мувик загрузит, но на кадр переходить откажется. Вот что смущает, так это то, что даже ошибку не выведет.


Часовой пояс GMT +4, время: 21:07.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.