Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   как подрузить картинки в цикле через loadClip()??? (http://www.flasher.ru/forum/showthread.php?t=90760)

MashaViv 17.01.2007 17:57

как подрузить картинки в цикле через loadClip()???
 
Всем привет!!!!

у меня вознилка вот такая проблема.
Мне надо загрузить несколько картинок причем какие именно картинки поределяется динамически и урл берутся из БД.
Я пыталсь сделать так: загрузила все урл в масив , а потом пыталась в цикле for(){} загружать из с помощью loadClip.
Вот код:
Код:

var masLoadedObj = new Array();
var masListener = new Array();
var masData = new Array();
for(var i = 0;i<3;i++){
                name_mc = "image_mc_"+i;
                  this.createEmptyMovieClip(name_mc,this.getNextHighestDepth());
                masLoadedObj[i] = new MovieClipLoader();
                masListener[i] = new Object();
                masLoadedObj[i].addListener(masListener[i]);
                url = "picture/"+masData[i+1];
                masLoadedObj[i].loadClip(url,name_mc);
                masListener[i].onLoadInit = function(target_mc:MovieClip) {
                        target_mc._width = 100;
                        target_mc._height = 100;
                        target_mc._x = i*10;
                        target_mc._y = i*10;
                };

но в этом случае он выдает ошибку,что не может открыть последнюю из всех эти картинок.
Т.е если 3 картинки то он пишет что не может открыть file:////D|/direction/im(3).jpg.

если 2 картинки то он пишет что не может открыть file:////D|/direction/im(2).jpg.
а если одна картинка то все нормально.
Помогите пожалуйса!Что тут происходит????
вот я думала мож он ругается потому что не успевает загрузить одну какртинку ,то есть на срабатывает событие onLoadComplete, а цикл продолжается, и он начинает грузить другую...

Если это так, то как надо правильно все сдеалть, чтоб работало????
ПОЖАЛУЙСТА!!!!!ПОМОГИТЕ!!!
заранее СПАСИБО!!!

Что такое хорошо? 17.01.2007 21:36

может это - про цикл и ID тебе поможет
http://flasher.ru/forum/showthread.php?t=84941

Kikasso 18.01.2007 06:01

Вполне можно обойтись одним лоадером:
Код:

// список картинок, полученный из базы данных
var masData:Array = new Array("pik1.jpg","pik2.jpg","pik3.jpg","pik4.jpg");

var mcl:MovieClipLoader =  new MovieClipLoader();
var ls:Object = new Object();
var name_mc:String;
var url:String;

ls.onLoadInit = function ( target_mc:MovieClip ) {
                        target_mc._width = 100;
                        target_mc._height = 100;
                        target_mc._y = target_mc.i * 10;
                        target_mc._x = target_mc.i * 10;
};

mcl.addListener( ls );

for( var i:Number = masData.length-1; i >= 0; i-- ){
        name_mc = "image_mc_"+i;
        this.createEmptyMovieClip( name_mc, this.getNextHighestDepth(), { i:i });
    url = "picture/"+ masData[i];
        mcl.loadClip(url,name_mc);
}

PS: не проверял, но должно работать.

iNils 18.01.2007 06:13

Не стоит грузить файлы все сразу. Лучше по 1-2 штуки, дождитесь загрузки одного объекта и начинайте следующий. У браузеров количество одновременно скачиваемых файлов не так уж велико, например у ИЕ по умолчанию 2, остальные будут стоять в очереди. И если скорость инета маленькая или вес файла большой, то запрос к последнему файла может привысить время ожидания.

Kikasso 18.01.2007 06:23

В таком случае так:
Код:

// список картинок, полученный из базы данных
var masData:Array = new Array("pik1.jpg","pik2.jpg","pik3.jpg","pik4.jpg");

var mcl:MovieClipLoader =  new MovieClipLoader();
var ls:Object = new Object();
var name_mc:String;
var url:String;

ls.onLoadInit = function ( target_mc:MovieClip ) {
        target_mc._width = 100;
        target_mc._height = 100;
        target_mc._y = target_mc.i * 10;
        target_mc._x = target_mc.i * 10;
        if(target_mc.i>0)loadNext();
};

mcl.addListener( ls );

var i:Number = masData.length-1;
function loadNext():Void{
        i--;
        name_mc = "image_mc_"+i;
        this.createEmptyMovieClip( name_mc, this.getNextHighestDepth(), { i:i });
        url = "picture/"+ masData[i];
        mcl.loadClip(url,name_mc);
}
loadNext();

upd: в коде ошибка, выделено красным, см. ниже

silin 18.01.2007 10:43

только initObject нельзя передать в createEmptyMovieClip, к тому ж в него еще и грузим ..
не вижу почему эту же i (которую для загрузки пользуем) не использовать
Код:

ls.onLoadInit = function ( target_mc:MovieClip ) {
        target_mc._width = 100;
        target_mc._height = 100;
        target_mc._y = i * 10;
        target_mc._x =i * 100;
        i--;
        if(i>=0)loadNext();
};

mcl.addListener( ls );

var i:Number = masData.length-1;
function loadNext():Void{
        name_mc = "image_mc_"+i;
        this.createEmptyMovieClip( name_mc, this.getNextHighestDepth());
        url = "picture/"+ masData[i];
        mcl.loadClip(url,name_mc);
}
loadNext();


Kikasso 18.01.2007 11:23

точно, я двоешник ((
с другой стороны, i нам может и пригодиться, так что можно просто назначить:
Код:

var mc:MovieClip = createEmptyMovieClip( name_mc, this.getNextHighestDepth());
mc.i = i;
url = "picture/"+ masData[i];
mcl.loadClip(url, mc);


etc 18.01.2007 11:30

А ты проверял, существует-ли твоя переменная после загрузки картинки, а?

MashaViv 18.01.2007 13:46

Привет Всем!
Kikasso , я пыталась сделать так как ты посоветовал, но у меня все равно та же беда.Взяла просто и скопировала твой код(тот где с loadNext()) и запустила его.И конечно, поменять имена файлов я не забыла. Но у меня все та же ошибка появляется.
----------------------------------------------------------------------
Error opening URL "file:///D|/Masha/gallery/picture/im3.jpg"
Error opening URL "file:///D|/Masha/gallery/picture/im2.jpg"
Error opening URL "file:///D|/Masha/gallery/picture/im1.jpg"
Error opening URL "file:///D|/Masha/gallery/picture/im0.jpg"
----------------------------------------------------------------------
Но разница лишь в том что если раньше он выводил такое сообщение только на последний загружаемы файл , то теперь на все((((
Что это такое вообще не пойму((((
Вроде же все должно грузиться нормально.В чем загвоздка?????7
Подскажите пожалуйса!
спасибо)))

Kikasso 18.01.2007 14:10

так а файлы где лежат и как называются??

Kikasso 18.01.2007 14:24

Цитата:

Сообщение от __etc
А ты проверял, существует-ли твоя переменная после загрузки картинки, а?

упс.. Разумеется, после загрузки картинки переменная исчезнет.

берите код silin'a

Приношу извинения за дезинформацию и ухожу в монастырь.:o

silin 18.01.2007 14:36

загадочная какая-то история: если "Error opening URL", то как же следующая заргузка запускается, ведь onLoadInit не должен сработать ..
не говоря уже о том, что в изначальном раскладе Kikasso вообще только первая загрузка проходит..
MashaViv, ты свой код покажи, интересно же как такого можно добиться..
к слову: такая последовательная загрузка чревата тем, что все заткнется при ошибке (хотя можно и onLoadError задействовать на этот случай), если же грузить всех сразу, то недополучим только ущербные..
а насчет ограничений на одновременную загрузку у браузера, так не факт, что плагин у него разрешения спрашивает, iNils, откуда информация?

Kikasso 18.01.2007 14:39

последний совет.. это работает ( под Windows )..
вот это
Код:

dir *.jpg /b >dir.txt
сохранить как dir.bat в папке с картинками и запустить.
в dir.txt получим список файлов.

Kikasso 18.01.2007 14:47

Злополучная затираемая i отвечает за позиционирование, и никак не влияет на загрузку, так что корень зла не в этом. Проверил.

etc 18.01.2007 14:53

Тогда какой смысл в присвоении i?

silin 18.01.2007 14:56

как же не влияет, если if(target_mc.i>0) loadNext();

Kikasso 18.01.2007 14:59

Вложений: 1
Мне остается только приложить готовое работающее решение, собраное из всего в этой ветке. Нуждается в распаковке.

Kikasso 18.01.2007 15:00

мне - автобан на неделю.

silin 18.01.2007 15:08

работающее нам не надо, нам с 4мя 'Error opening URL' давай..
зы: я бы тож непрочь по автобану поездить хоть чуть-чуть: достали наши дороги :)

Kikasso 18.01.2007 15:21

Цитата:

Сообщение от silin
работающее нам не надо, нам с 4мя 'Error opening URL' давай..

Это просто - берешь код из моего первого поста и запускаешь. Как раз и выдаст, картинок-то нет. :victory:
Если картинки есть, он грузит все, только одну над другой :o

silin 18.01.2007 15:25

>>Как раз и выдаст, картинок-то нет.
без картинок я и сам могу, ты с картинками попробуй..

MashaViv 18.01.2007 15:59

Вот пожалуйста то самы код который выдает ошибки типа
---------------------------------------------------------
Error opening URL "file:///D|/Masha/gallery/picture/im(3).jpg"
---------------------------------------------------------
Код:

this.stop();
var sender:LoadVars = new LoadVars();
var reciver:LoadVars = new LoadVars();
sender.page = bNext_mc.counter;
sender.sendAndLoad("http://test2.ru/content.php", reciver, "POST");

reciver.onData = function(mes:String):Void{
        var masLoadedObj = new Array();
        var masListener = new Array();
        var masData = new Array();
        var masUrl = new Array();
        var g:Number = 0;
        var j:Number = 0;
        var index:Number = null;
       
        masData = mes.split("|");
        for(var g = 0;g<masData.length; g++){
                index = masData[g].lastIndexOf(".jpg");
                if(index!=-1){
                        masUrl[j] = masData[g];
                        j++;
                };
        }
       
        //var masUrl:Array = new Array("im(0).jpg","im(1).jpg","im(2).jpg","im(3).jpg"); этот массив грузиться из базы

        var mcl:MovieClipLoader =  new MovieClipLoader();
        var ls:Object = new Object();
        var name_mc:String;
        var url:String;

        ls.onLoadInit = function ( target_mc:MovieClip ) {
                target_mc._width = 100;
                target_mc._height = 100;
                target_mc._y = i * 10;
                target_mc._x =i * 100;
                i--;
                if(i>=0)loadNext();
        };

        mcl.addListener( ls );

        var i:Number = masUrl.length-1;
        function loadNext():Void{
                name_mc = "image_mc_"+i;
                _root.createEmptyMovieClip( name_mc,_root.getNextHighestDepth());
                url = "picture/"+ masUrl[i];
               
                mcl.loadClip(url,name_mc);
        }
        loadNext();
}

я пробовало то что вы давали, оно работает естественно. А вот так нет. Может дело в том , что у меня оброботка иде в событии onData()????

MashaViv 18.01.2007 16:26

А скажите еще пожалуйста, если ограничения на то какого размера грузить картинки в цикле???
Вот например пишу так :
Код:

this.stop();
for (var i = 0;i<_root.masUrl.length;i++){
        trace(_root.masUrl[i]);
}
// список картинок, полученный из базы данных
//var masData:Array = new Array("DrinkIt.jpg", "P1050153.jpg", "P1140179_CB.jpg", "P1150418.jpg");

var masData:Array = new Array("im(0).jpg","im(1).jpg","im(2).jpg","678.jpg");

var mcl:MovieClipLoader =  new MovieClipLoader();
var ls:Object = new Object();
var name_mc:String;
var url:String;
ls.onLoadComplete = function(target_mc:MovieClip) {
        trace("cjom");
}

ls.onLoadInit = function ( target_mc:MovieClip ) {
        //target_mc._width = 100;
        //target_mc._height = 100;
        //target_mc._y = i * 10;
        //target_mc._x =i * 100;
        i--;
        trace("in");
        if(i>=0)loadNext();
};

mcl.addListener( ls );

var i:Number = masData.length-1;
function loadNext():Void{
        name_mc = "image_mc_"+i;
        this.createEmptyMovieClip( name_mc, this.getNextHighestDepth());
        url = "picture/"+masData[i];
        mcl.loadClip(url,name_mc);
}
loadNext();

это кстати код который я скачала с той самой ссылки))
у меня все картинки весят гд-то по 200кило.Запускаю код.И ошибка та же самая.
---------------------------------------------------------
Error opening URL "file:///D|/Masha/gallery/picture/im(3).jpg"
---------------------------------------------------------
Теперь беру и уменьшаю катринук im(3).jpg до размеров 46,0 КБ , терь ее рзамер 100*100 . Запускаю.И....О чудо одна картинка im(3).jpg загрузилось и для остальных ошибка
---------------------------------------------------------
Error opening URL "file:///D|/Masha/gallery/picture/im(2).jpg"
---------------------------------------------------------
Тут получается дело в размере что ли?????
Ничего не понимаю(((

MashaViv 18.01.2007 16:38

Ну я вообще не пойму что за чудеса!!!
Вот смотрите.Изначально изображение у меня веслио 200 кило и не грузилось и было ошбика
---------------------------------------------------------
Error opening URL "file:///D|/Masha/gallery/picture/im(3).jpg"
---------------------------------------------------------
я думал что картинка слоишком большая.Взяла фотошоп изменила размер до 40 кило.Все ок, все грузится.Потом взяла и увелчичило до 4метро.И гружится же.Так что такое ???? может файлы просто бачные , а я тут все гружу)))???!!!

MashaViv 18.01.2007 16:47

Млин..... это же пипец просто какой-то!!!!!!
Дело в том , что все эти обишки возникали, потому что я использовала недопустимые имена(((((((
вот
im1.jpg допустмо!!!
im(1).jpg не допустимо!!
вот и все...
эх обидно((((
Всем огромное спасибо за помощь.!!!!
Без Вас я бы не справилась!!!!!!!!
Выручили)))

silin 18.01.2007 16:48

оч. похоже на то, что просто файлы битые..
тестил код из поста #22 : если от пхп приходит то, что надо, то все должно работать..
зы: reciver.onData надо бы определить до sender.sendAndLoad , хотя дело не в этом, канеш..

зыы: в локале im(1).jpg тож проходит, однако..

Kikasso 18.01.2007 19:50

Поздравляю с решением проблемы ))

Все наверняка гораздо проще. В php после закрывающего "?>" остался перевод строки или пробел. Это приплюсовалось к имени последнего файла, и такого файла естественно нет. В этом был изначальный трабл.
Причем этот пробел мог быть и в другом файле, подключенном по по include.

Kikasso 18.01.2007 21:07

с помощью XML картинки список картинок получать надежнее:

files.xml:
Код:

<xml>
<![CDATA[pic0.jpg]]>
<![CDATA[pic1.jpg]]>
<![CDATA[pic2.jpg]]>
<![CDATA[pic3.jpg]]>
<![CDATA[pic4.jpg]]>
<![CDATA[pic5.jpg]]>
<![CDATA[pic6.jpg]]>
<![CDATA[pic7.jpg]]>
</xml>

флеш:
Код:

var gallery_xml:XML = new XML();
gallery_xml.ignoreWhite = true;
gallery_xml.onLoad = function(success:Boolean) {
        if (success && this.status == 0) {
                var images:Array = this.firstChild.childNodes;
                // список картинок       
                trace (images);
        }else{
                trace("ЕГГОГ");
        }
//delete this;
//^^ так не работает
delete gallery_xml;
// а так работает - удаляем ненужный больше xml
}
gallery_xml.load("files.xml");

upd: подрихтовано

etc 18.01.2007 23:40

Kikasso, а что, простите, делает delete this?

Kikasso 19.01.2007 02:19

Цитата:

Сообщение от __etc
Kikasso, а что, простите, делает delete this?

так было написано в файле gallery_tween.fla только немного по-другому:
Код:

gallery_xml.onLoad = function(success:Boolean) {
        try {
                /* if you are able to successfully load and parse the gallery from a remote XML file,
                  parse out the image names and add them to an array. */
                if (success) {
                        var images:Array = this.firstChild.childNodes;
                        var gallery_array:Array = new Array();
                        for (var i = 0; i<images.length; i++) {
                                gallery_array.push({src:images[i].firstChild.nodeValue});
                        }
                        /* call the displayGallery function which handles loading in each
                          of the gallery images and placing them on the Stage. */
                        displayGallery(gallery_array);
                } else {
                        throw new Error("Unable to parse XML");
                }
        } catch (e_err:Error) {
                trace(e_err.message);
        } finally {
                delete this;
        }
};

файл находится по адресу
.../Flash8/Samples and Tutorials/Samples/Action Script/Galleries
Так что вопрос собственно не ко мне.
Разработчики просто поленились проверить, удаляет ли эта фраза ненужный более xml.
В таком виде - не удаляет.
В таком -
Код:

//delete this;
delete gallery_xml; // да, изнутри!

удаляет, что только что проверено:
Код:

setTimeout(function (){ trace(gallery_xml);}, 2000 );
xml там выглядит так:
Код:

<?xml version="1.0"?>
<gallery>
        <img><![CDATA[DCP_0730.jpg]]></img>
        <img><![CDATA[DCP_0731.jpg]]></img>
        <img><![CDATA[DCP_0732.jpg]]></img>
        <img><![CDATA[DCP_0733.jpg]]></img>
        <img><![CDATA[DCP_0734.jpg]]></img>
</gallery>

где тут написано "utf-8" ?

etc 19.01.2007 02:29

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

А про utf-8 — нигде не написано, а должно. А кто сказал, что стандартные примеры являются самыми-самыми? delete this уже показывает то, что разработчик не в теме.

Kikasso 19.01.2007 02:41

Цитата:

Сообщение от __etc
delete gallery_xml никак не изнутри, просто повезло, что область видимости совпадает. Две секунды можно и не ждать.

Почему же повезло? Так и задумывалось. Изнутри дается команда. Две секунды мне не жалко.
А по сабж, я внимательно перечитал симптомы и готов поспорить, что ошибка была именно в паразитном символе после закрывающего тега в php. Это все объясняет - почему не грузился именно последний джепег.
Пробел в текстовом поле и в output не виден, а на сервер посылается в виде %20 ( перевод строки %0A ).

Kikasso 19.01.2007 02:53

Цитата:

Сообщение от __etc
А кто сказал, что стандартные примеры являются самыми-самыми? delete this уже показывает то, что разработчик не в теме.

Насчет стандартных примеров, что они самые-самые, никто не говорил.
Они просто работают-работают.
delete this - ну, захотелось человеку прибраться, отмахнулся веником.. а тут надо бумажку на палочку накалывать..
А фразу "разработчик не в теме" можно я себе в подпись возьму? C вашим (с) естественно?

etc 19.01.2007 03:31

Цитата:

Сообщение от Kikasso
Почему же повезло?

А ты сделай объявление onLoad метода в другом месте и всё, кирдык, если повезет, удалишь ссылку на XML только в конкретной области видимости, зато другая останется, а вместе с ней и XML. И GC не удалит XML как объект, на которого нет ссылок. Ты «изнутри» обращаешься наружу, вне метода. А вне метода могут быть совершенно другие объекты, переменные и т.п. А ты привязываешь четко к тому, что объект с заданным именем вне метода существует. Вовсе не факт, что существует.

з.Ы. Я про конкретную вещь в коде, не столько про проблему загрузки, сколько про логику.

з.Ы.Ы. Фразу — пожалуйста.

Kikasso 19.01.2007 08:49

Цитата:

Сообщение от __etc
А ты сделай объявление onLoad метода в другом месте и всё, кирдык

Этого я делать как раз не собирался. Я помню обсуждение http://www.flasher.ru/forum/showthre...796#post596796 и на какой изврат пришлось пойти, чтобы удалить объект методом obj.del(), и что delete только удаляет ссылку, а за самим объектом приходит сборщик мусора с косой (когда ссылок больше нет) я прекрасно знаю.
"delete this" я не писал, я это оставил, есть небольшая разница (семантическая). "изнутри" - ну, изнутри скобок.
К слову, можно и оставить именно этот XML в покое. Или объявить его локально внутри функции, возвращяющей массив с картинками.
Что разработчики не ангелы и код в примерах не эталон, тоже известно. Пример я привел для иллюстрации удобства XML в данном конкретном случае - вместо того, чтобы разбивать строку, массив можно получить автоматически.
Код:

...
var images:Array;
gallery_xml.onLoad = function(success:Boolean) {
 if (success && this.status == 0) images = this.firstChild.childNodes;
}
...

массив остается и после удаления XML.
Кроме удобства, если у нас картинки выдаются по адресам вида
piks.php?i=25&message=hello&rand=123456
передать через LoadVars нереально, а через CDATA запросто.


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

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