Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Загрузка нескольких изображений (странная проблема...) (http://www.flasher.ru/forum/showthread.php?t=137459)

DenisS1 14.03.2010 12:13

Загрузка нескольких изображений (странная проблема...)
 
Нужно загрузить несколько изображений по ссылкам, хранящимся в массиве. Загруженные изображения сохраняю в другой массив.
Код AS3:

private var imgLoader:Loader=new Loader();
private var _i:int=0, _j:int=0;
// функция загружает изображения для карты (рекурсивно)
public function loadImages():void{
  trace(GraphicsLayer.figures[_i].imageURL[_j]);
  imgLoader.contentLoaderInfo.addEventListener(Event.COMPLETE, loadingImageComplete);
  imgLoader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, handlerForIOError);
  imgLoader.load(new URLRequest(GraphicsLayer.figures[_i].imageURL[_j]));
} 
private function loadingImageComplete(e:Event):void{
  imgLoader.contentLoaderInfo.removeEventListener(Event.COMPLETE, loadingImageComplete);
  imgLoader.contentLoaderInfo.removeEventListener(IOErrorEvent.IO_ERROR, handlerForIOError);         
  GraphicsLayer.figures[_i].images[_j]=imgLoader;
  trace("Загружено в "+(_j).toString());
  _j++;
  if(_j==GraphicsLayer.figures[_i].imageURL.length){_j=0; _i++;}
  if(_i==GraphicsLayer.n){_i=0; _j=0; return}
  loadImages();
}
private function handlerForIOError(e:Event):void{
  trace("Error: Неудачная попытка загрузки изображения "+
  GraphicsLayer.figures[_i].imageURL[_j]);
  _j++;
  if(_j==GraphicsLayer.figures[_i].imageURL.length){_j=0; _i++;}
  if(_i==GraphicsLayer.n){_i=0; _j=0; return}
  loadImages();
}

В результате всегда загружается только последнее изображение. Никаких сообщений об ошибке при этом не выводится. Судя по trace-у, изображения грузятся куда надо.
Это уже не первый вариант. До этого делал циклом - тогда последнее изображение загружалось вместо всех предыдущих, т.к. цикл, не дождавшись окончания загрузки, шёл дальше.
Подскажите, как сделать? Раньше никогда не сталкивался с такой задачей. Делаю программу на конкурс, сегодня последний день. :(


P.S. Оказалось, достаточно добавить после GraphicsLayer.figures[_i].images[_j]=imgLoader; ещё одну строчку: imgLoader=new Loader();

Felicast 14.03.2010 13:13

надо для каждого изображения использовать свой лоадер. или грузить поочереди
зы: у вас очень плохо оформлен код. я не нашел закрывающей скобки "}" у метода loadImages

DenisS1 14.03.2010 13:33

Я уже пробовал это - делал массив Loader-ов. Но как я в функции loadingImageComplete() определю, какое это изображение и в какую ячейку массива мне его записывать? Функция ведь не знает номер того Loader-а, который её вызвал. Вот если бы можно было создать массив функций...

Felicast 14.03.2010 14:01

наследуйтесь от лоадера. добавте i и j
Код AS3:

class MyLoader extends Loader
{
        public var i:int;
        public var j:int;
        public function MyLoader(i:int, j:int)
        {
                super();
                this.i = i;
                this.j = j;
        }
}

но это - первое, что в голову пришло. можно что-нибудь и поэлегантлей придумать

AlexDesinger 14.03.2010 15:35

так, покажите код где у вас используется цикл "for" далее -
в функции или прямо в цикле - для каждой картинки - свой отдельный loader, который прямо там же пихает элементы в массив.

DenisS1 14.03.2010 19:46

Уже всё заработало. :) Я отредактировал первый пост - смотрите постскриптум.

Bgg 06.04.2010 13:06

У меня почти тоже самое, только немного наоборот :D
Код AS3:

//Загружаю
var context:LoaderContext = new LoaderContext();
if (Security.sandboxType!='localTrusted') context.securityDomain = SecurityDomain.currentDomain;
context.applicationDomain = ApplicationDomain.currentDomain;
 
loader = new Loader();
urlRequest = new URLRequest(path);               
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, completeLoad);
loader.load(urlRequest, context);
//Сохраняю
Security.allowDomain(loader.contentLoaderInfo.url);
movClass = loader.contentLoaderInfo.applicationDomain.getDefinition("mov") as Class;
arraySWF.push(movClass);//складываю в массив
...
var mov:MovieClip = new arraySWF[i]
addChild(mov);//ну и потом добавляю в цикле

Локально работает все отлично.
Но как только гружу во вконтакт, то добвляются только самый первый обьект который загрузлся. Т.е. как будто в массиве arraySWF все одинаковые обьекты(arraySW[0] = arraySW[1] =...)

koIIImarik 06.04.2010 13:31

Очень советую для организации большого количества объектов использовать SomaLoader.

Для того, чтобы организовать расстановку картинок в своём положении, можно использовать возможность «задавания» за ранее созданных контейнеров для картинок или возможность указания для каждого загружаемого объекта списка параметров, в которых можно указать x и y координаты.

Bgg 06.04.2010 13:49

Цитата:

Сообщение от koIIImarik (Сообщение 898350)
Очень советую для организации большого количества объектов использовать SomaLoader.

Проблема не в организации, проблема скорей всего в разнице работы flashPlayer'а в программных средах.

AlexDesinger 06.04.2010 13:52

Bgg
я только один способ знаю, который везде хорошо работает и локально и в сети -
в одном цикле вы создаете контейнер для картинки(if needed), затем присоединяете в каждый контейнер свой загрузчик, слушатель к этому загрузчику на тему окончания загрузки, присоединяете другие данные и запихиваете свой контейнер в массив, а также можете сразу и расставить картинки в нужном порядке в этом же цикле, вот тогда вам сразу будет все видно что зачем у вас происходит по порядку и тогда почти наверняка загрузятся все картинки как нужно.


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

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