Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   addChild у Loader (http://www.flasher.ru/forum/showthread.php?t=140047)

Follower 18.05.2010 20:30

addChild у Loader
 
Здравствуйте!
Уже долго бьюсь над такой проблемой.
Object, состоящий из семи Loader, отказывается использовать addChild, хотя файл вроде бы загружен, так как событие COMPLETE при этом срабатывает. Если в это же место поставить обычный одиночный Loader, то все работает.
Вот сам код:

Код AS3:

var ldr:Object = new Object;
for (i=0;i<7;i++){
ldr[i]=new Loader();
}
ldr[3].contentLoaderInfo.addEventListener(Event.COMPLETE, imgLoaded);
function Compl():void {
for (i=0; i<7; i++) {
Url = new URLRequest("3_1_1.jpg");
ldr[i].load(Url);
addChild(ldr[i]);
}


Zebestov 18.05.2010 22:49

ничего не получилось =( грузит твой пример все 7 картинок и всё тут!

Follower 19.05.2010 10:50

Re:
 
Сейчас напишу поподробней. Вот пустой файл только с этим кодом:
Код AS3:

import flash.display.Loader;
 
var i:int;
var Url:URLRequest;
var ldr:Object = new Object;
for (i=0; i<7; i++) {
        ldr[i]=new Loader();
        ldr[i].height=240;
        ldr[i].width=180;
        ldr[i].x=180*i;
}
 
ldr[6].contentLoaderInfo.addEventListener(Event.COMPLETE, imgLoaded);
 
сompl();
 
function сompl():void {
        for (i=0; i<7; i++) {
                Url = new URLRequest("file:///F:/SITE/images/galery/3_3_"+String(i+1)+".jpg");
                ldr[i].load(Url);
                addChild(ldr[i]);
        }
}
 
function imgLoaded(event:Event):void {
        trace("Complete!");
}

Из ошибок выводит только "Complete!". URL правильный. Все равно не отображает.

Жень Шень 19.05.2010 11:41

Вы пытаетесь отобразить картинки не дождавшись загрузки.
Попробуйте так:
Код AS3:

import flash.display.Loader;
 
var i:int;
var Url:URLRequest;
var ldr:Object = new Object;
for (i=0; i<3; i++) {
        ldr[i]=new Loader();
        ldr[i].height=240;
        ldr[i].width=180;
        ldr[i].x=180*i;
        ldr[i].contentLoaderInfo.addEventListener(Event.COMPLETE, imgLoaded);
}
 
сompl();
 
function сompl():void {
        for (i=0; i<3; i++) {
                Url = new URLRequest(String(i+1)+".jpg");
                ldr[i].load(Url);
        }
}
function imgLoaded(e:Event):void {
        addChild(e.target.content);
        trace("Complete!");
}

Да, по окончании загрузки отпишитесь от листенеров

incvizitor 19.05.2010 12:01

Код AS3:

ldr[6].contentLoaderInfo.addEventListener(Event.COMPLETE, imgLoaded);

А кто Вам вообще сказал что последняя картинка загрузится последней?

Zebestov 19.05.2010 12:06

и почему это нельзя добавлять лоадер до загрузки? я не говорю про корректность этого действия. я про ошибку — спокойно себе аттачится и уже на экране ждет загрузки.

P.S.
еще раз повторюсь — ошибку воспроизвести не удалось. вставил тупо первый код, закомментировал лиснер и подставил URL картинки наугад.

Follower 19.05.2010 13:18

Спасибо
 
Жень Шень, спасибо, в таком виде все работает:
Код AS3:

import flash.display.Loader;
 
var i,j:int;
var Url:URLRequest;
var ldr:Object = new Object;
for (i=0; i<7; i++) {
        ldr[i]=new Loader();
        ldr[i].contentLoaderInfo.addEventListener(Event.COMPLETE, imgLoaded);
}
 
Compl();
j=0;
 
function Compl():void {
        for (i=0; i<7; i++) {
                Url = new URLRequest("file:///F:/SITE/images/galery/3_3_"+String(i+1)+".jpg");
                ldr[i].load(Url);
        }
}
 
function imgLoaded(e:Event):void {
        e.target.content.height=240;
        e.target.content.width=180;
        e.target.content.x=j*180;
        j++;
        addChild(e.target.content);
}

Однако очень неудобно, что размер и положение можно изменять только после загрузки, иначе говорит, что кто-то там не должен быть null.
Нельзя ли как-то передавать в imgLoaded номер обьекта?

Код AS3:

z=int(String(e.target.url).substr(34,1))-1;

Вот так AS3 плодит индусов(

Добавлено через 2 часа 55 минут
Благодаря вашим мудрым советам отображение работает, но еще один вопрос.

Как мне так обработать нажатие на это самое отобразившееся дитя, чтобы нажатое менялось контентом с нулевым?

Если просто
Код AS3:

if (z!=0) {
        l[z].contentLoaderInfo.addEventListener(MouseEvent.CLICK, chang);
}
...
function chang(e:MouseEvent):void {
        var temp:Loader=new Loader;
        var z:int;
        z=1;
        removeChild(l[0].content);
        removeChild(l[z].content);
        temp=l[0];
        l[0]=l[z];
        l[z]=temp;
        addChild(l[0].content);
        addChild(l[z].content);
}

не работает. Переданное из e:Event вообще странное.

dimarik 19.05.2010 23:59

А с каких пор у Loader работает addChild?

Zebestov 20.05.2010 00:05

это по-испански. "аддчайлд и лоадер" по-нашенски :D

Follower 20.05.2010 00:15

А по существу вопроса?

Zebestov 20.05.2010 00:29

а по существу — диво дивное!
если не затруднит, сделай отдельную флэшку, в которой только код, допустим, из первого примера, и выложи (только не забудь или URL вместо локального пути, или картинку тоже в архив сложить в ту же папочку в идеале... ну для чистоты эксперимента).
бо я уже говорил выше — твой код работает.

i.o. 20.05.2010 00:32

Цитата:

Код AS3:

z=int(String(e.target.url).substr(34,1))-1;


Да уж, кривовато.. Можно просто в цикле for in пройтись по ldr и найти по e.target нужное свойство объекта. Кстати да, а почему не Array, а Object? Вы вроде как индекс хотите узнать.. Так у Array есть замечательный метод indexOf():int, который и вернет вам непосредственно индекс лоадера. Тогда и for in окажется ненужным )

Follower 20.05.2010 01:08

Там пониже почитайте. Отображение на экране худо-бедно работает, мне сейчас нужна обработка нажатий мышью по детям.

Жень Шень 20.05.2010 12:26

У вас помещаются изображения на сцену, а они не интерактивны.
Может это поможет:
Код AS3:

import flash.display.Loader;
var i,j:int;
var Url:URLRequest;
var ldr:Sprite;
Compl();
j=0;
function Compl():void {
        for (i=0; i<7; i++) {
                //Url = new URLRequest(String(i+1)+".jpg");
                Url = new URLRequest("file:///F:/SITE/images/galery/3_3_"+String(i+1)+".jpg");
                var l=new Loader();
                l.contentLoaderInfo.addEventListener(Event.COMPLETE, imgLoaded);
                l.load(Url);
        }
}
function imgLoaded(e:Event):void {
        e.target.removeEventListener(Event.COMPLETE, imgLoaded);
        e.target.content.height=240;
        e.target.content.width=180;
        e.target.content.x=j*180;
        ldr = new Sprite();
        ldr.addChild(e.target.content)
        ldr.addEventListener(MouseEvent.CLICK, chang);
        addChild(ldr);
        j++;
}
function chang(e:MouseEvent):void {
        trace(e.target.parent.getChildIndex(e.target))
        // здесь описать свой обмен
}


Follower 21.05.2010 14:01

Вот этот вот index, насколько я понимаю, можно задавать addChildAt? Тогда бы можно было в нем хранить номер картинки.

Добавлено через 34 минуты
А может, проще обработать нажатие по координатам? Есть такая возможность?

dimarik 21.05.2010 16:21

Цитата:

Сообщение от Жень Шень (Сообщение 909529)
У вас помещаются изображения на сцену, а они не интерактивны.

Жень Шень, а зачем Вы перемещаете loader.content (as Bitmap) из InteractiveObject (Loader), в InteractiveObject (Sprite)? Может, все-таки оставим им родного папу?

Код AS3:

var loader:Loader = LoaderInfo(event.target).loader;
var interactiveObject:        DisplayObject = super.addChild(loader);
 
//trace("before: ", loader.numChildren);
//interactiveObject = super.addChild(loader.content);
 
trace("after: ", loader.numChildren);
 
interactiveObject.addEventListener(
        MouseEvent.CLICK,
        function(event:Event):void {
                trace("clicked");
        }
);


Follower 21.05.2010 18:02

Объясните мне, пожалуйста, что СИЕ значит:

TypeError: Error #1034: Type Coercion failed: cannot convert "file:///f:/SITE/IMAGES/galery/3_3_7.jpg" to flash.net.URLRequest.
at Gallery_fla::MainTimeline/chang()

и какого он не считает эту строку годной?

dimarik 21.05.2010 18:12

Это значит, что [object String] невозможно сконвертировать в [object flash.net.URLRequest].
Наверно, грузите как loader.load('file:///...');

Follower 21.05.2010 18:15

Код AS3:

var temp1,temp2:String;
temp1=l[0].contentLoaderInfo.url;
temp2=l[t].contentLoaderInfo.url;
l[0].load(URLRequest(temp2));
l[t].load(URLRequest(temp1));

вот так не работает

КорДум 21.05.2010 18:16

Код AS3:

loader.load(new URLRequest(url));


Follower 21.05.2010 18:17

Ага, new надо. Спасибо.

Добавлено через 23 минуты
Говорит теперь ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller.
at flash.display::Loader/flash.display:Loader::_load()
at flash.display::Loader/load()
at Gallery_fla::MainTimeline/chang()

Код AS3:

var temp1,temp2:String;
        removeChild(l[0].content);
        removeChild(l[t].content);
        l[0].unload;
        l[t].unload;
        temp1=l[0].contentLoaderInfo.url;
        temp2=l[t].contentLoaderInfo.url;
        l[0].load(new URLRequest(temp2));
        l[t].load(new URLRequest(temp1));
        this.addChild(l[0].content);
        this.addChild(l[t].content);

Причем говорит это не про addChild, а про .load

Psycho Tiger 21.05.2010 18:45

это говорит removeChild.

Follower 21.05.2010 18:46

А вот и нет, removeChild срабатывает оба раза. Проверено комментированием, дебагом, и визуально в самой флешке.

Мож кто знает, как проще поменять местами содержимое, не меняя размеров и положения?

Еще, в AS в принципе есть целочисленное деление или округление в меньшую сторону?

Psycho Tiger 21.05.2010 19:02

Тьфу, я дурак. В стеке же даже видно. Ограничите мне доступ к алкоголю.

КорДум 21.05.2010 19:08

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

Psycho Tiger 21.05.2010 19:43

[Алкоголизм]
А разве content у Loader`а может поменяться, в смысле что одним Loader`ом можно грузить несколько картинок?
[/Алкоголизм]

КорДум 21.05.2010 19:50

l[0] и l[t] - это два разных лоадера, нет?

Follower 21.05.2010 19:52

Всегда разные, там выше ограничено.
А по поводу деления?

Psycho Tiger 21.05.2010 19:52

Код AS3:

removeChild(l[0].content);
removeChild(l[t].content);
this.addChild(l[0].content);
this.addChild(l[t].content);

Я про это.

Follower 21.05.2010 19:54

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

КорДум 21.05.2010 20:01

Так, открываем хелп и что мы видим?
Чтобы удалить загруженный экранный объект, необходимо удалить объект Loader из дочернего массива родительского объекта DisplayObjectContainer.

Добавлено через 4 минуты
То есть, я так понимаю, что нужно правильно удалять содержимое и заново пересоздавать лоадер.

Follower 21.05.2010 20:10

Сделал, нет теперь ошибок, только вот и загружаться он не хочет. Хотя стоит правильный листенер, не запускается связанная с ним функция.
Код AS3:

        var temp1,temp2:String;
        removeChild(l[0].content);
        removeChild(l[t].content);
        l[0].unload;
        l[t].unload;
        temp1=l[0].contentLoaderInfo.url;
        temp2=l[t].contentLoaderInfo.url;
        l[0]=new Loader;
        l[t]=new Loader;
        l[0].addEventListener(Event.COMPLETE, Dostalo);
        l[t].addEventListener(Event.COMPLETE, Dostalo);
        l[0].load(new URLRequest(temp2));
        l[t].load(new URLRequest(temp1));
}
 
function Dostalo(e:Event):void {
        e.target.removeEventListener(Event.COMPLETE, Dostalo);
        addChild(e.target.content);
}


КорДум 21.05.2010 20:16

Сначала загружаем, затем присоединяем слушатель. Ну и советик, чтобы не запутаться, лучше сгруппировать код одного лоадера отдельно от второго.

Follower 21.05.2010 20:32

Что вы мне тут советуете)
Детская ошибка ведь. Я-то ладно, AS неделю знаю, но вы-то)
Листенер к contentLoaderInfo цепляется.

КорДум 21.05.2010 20:36

Хех, каюсь, не заметил. А может и я АС3 знаю неделю?) Ну да, невнимательность - порок.

Follower 21.05.2010 21:18

Фууух. Это было... неописуемо. По заявкам могу выслать этот памятник индусскому коду. Зато работает! Причем неплохо, и защищен от дураков средней руки.

Добавлено через 25 часов 25 минут
Adobe Flash невообразимо коварен, и когда я уже думал, что все, он опять подложил мне этакого поросеночка.

Суть в том, что запущенный из самого CS3 проект работает и грузит картинки, а вставленный в html - нет. Swf из проекта и экспортнутый идентичны, другой swf со сходными методами работает, будучи вставленный в такой же точно html. Кто-нибудь сталкивался?

ninth 24.05.2010 04:00

Чуточку не туда вопрос задал...

Хотя Follower сталкивался с подобным. Может сможете объяснить.

Как передать урл картинки, которая должна загружаться после клика по клипу превьюшке?
И что нужно для того, чтоб картинки не грузились хаотично(грузятся почемуто в произвольном порядке), а именно 00, 01, 02 ит.д. (то бишь по порядку)?

В общем простенький код:

Код AS3:

var mc:Sprite = new Sprite();
addChild(mc);
 
for (var i:int = 0; i <= 3; i++) {
        var minLoader:Loader = new Loader();
        minLoader.contentLoaderInfo.addEventListener(Event.INIT, ok);
        minLoader.load(new URLRequest("0" + i + ".jpg"));
}
function ok(event:Event):void {
        var mc_2:MovieClip = new MovieClip();
        mc.addChild(mc_2);
        var bitmap:Bitmap=Bitmap(event.target.content);
        if (mc.width>0) {
                bitmap.x=mc.width+10;
        }
        mc_2.addEventListener(MouseEvent.CLICK, go);
        function go(MouseEvent):void {
                trace(mc_2.name);
        }
        mc_2.addChild(bitmap);
}


КорДум 24.05.2010 12:19

Какие-то картинки весят меньше - они быстрее и грузятся. Здесь нужно переделать логику кода. А именно сделать примерно так:
Грузим первую картинку, ловим событие Event.COMPLETE, словили, загрузили вторую картинку, ловим событие...и так далее.
Цитата:

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

ninth 24.05.2010 23:27

Да вот именнонад этим я и бьюсь. Как всё это дело проследить и организовать?
Цитата:

Сообщение от КорДум (Сообщение 910521)
Грузим первую картинку, ловим событие Event.COMPLETE, словили, загрузили вторую картинку, ловим событие...и так далее.


КорДум 24.05.2010 23:36

Я бы сделал так, ничего другого в голову пока не приходит:
Код AS3:

private var picArr:Array = new Array("url1", "url2", ... , "urlN");
private var i:uint = 0;
...
var loader:Loader = new Loader();
loader.load(new URLRequest(picArr[i]));
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);
...
 
private function loadComplete(e:Event):void {
        e.target.removeEventListener(Event.COMPLETE, loadComplete);
        i++;
        if (picArr[i] !== null) {
                var loader:Loader = new Loader();
                loader.load(new URLRequest(picArr[i]));
                loader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadComplete);
        }
}

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


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

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