PDA

Просмотр полной версии : Загрузка нескольких картинок?


forward
23.06.2010, 19:51
Доброго времени суток!

Что не так? Загружаю из XML картинки, а грузится последняя из цикла...:eek:

count_avatar = 3;

for (i = 0; i < count_avatar; i++){

createEmptyMovieClip("clip", 0);

file = menu_xml.firstChild.childNodes[0].childNodes[i].childNodes[1].childNodes[0];

clip.maxWidth = 330;
clip.maxHeight = 300;
clip._x = random(100);
clip._y = random(100);

clip["image"+i].removeMovieClip();
clip.createEmptyMovieClip("image"+i, 0);
clip["image"+i].loadMovie(file);

}

mooncar
23.06.2010, 20:05
Хотя бы потому что
createEmptyMovieClip("clip", 0); - у вас в цикле постоянно на одном и том же 0-м уровне создается мувик clip, замещая уже созданный на предыдущем шаге.
Разумеется, все предыдущие загрузки идут прахом, они не успевают произойти - контейнер для загрузки уже исчез.

Возможно (без контекста не совсем все ясно, особенно с путями), так:
count_avatar = 3;
var loader:MovieClipLoader = new MovieClipLoader();

for (i = 0; i < count_avatar; i++)
{
clip = createEmptyMovieClip('clip' + i, i);
file = menu_xml.firstChild.childNodes[0].childNodes[i].childNodes[1].childNodes[0];
clip._x = random(100);
clip._y = random(100);
img = clip.createEmptyMovieClip('image', 0);
loader.loadClip(img, file);
}

forward
25.06.2010, 17:56
Сделал вот так все работает:


count_avatar = 3;

for (i = 0; i < count_avatar; i++)
{
file = menu_xml.firstChild.childNodes[0].childNodes[i].childNodes[1].childNodes[0];
//-----------------Грузим картинки---------------
var mc:MovieClip = createEmptyMovieClip("image" + i, i);
//-----------------Положение для картинок------
mc._x = i * 200;
mc._y = i * 200;
mc._xscale = 70;
mc._yscale = 70;

//Грузим мувики
mc.loadMovie(file);

//-------------Делаем кнопку------------

mc.onRelease = function()
{

trace("Нажатие");

};
}

Только вот не могу понять почему функция onRelease не работает? :(

lexa2000lexa
25.06.2010, 18:12
читайте в хелпе про класс MovieClipLoader и его обработчики onLoadInit и onLoadComplete.

mooncar
25.06.2010, 18:59
Прелюдия.... В моем предыдущем посте были перепутаны местами параметры в методе oadClip. Надо:
loader.loadClip(file, img);

А вот решение вам:

var count_avatar:Number = 3;
var loader:MovieClipLoader = new MovieClipLoader();
var listener:Object = new Object();
loader.addListener(listener);

listener.onLoadInit = function (target_mc:MovieClip)
{
var cont:MovieClip = target_mc._parent;
var i:Number = cont.num; //"вспоминаем" номер
target_mc._x = i * 200;
target_mc._y = i * 200;
target_mc._xscale = 70;
target_mc._yscale = 70;
target_mc.onRelease = mcOnRelease;
};


for (i = 0; i < count_avatar; i++)
{
file = menu_xml.firstChild.childNodes[0].childNodes[i].childNodes[1].childNodes[0];
//контейнер верхнего уровня
var cont:MovieClip = this.createEmptyMovieClip('cont' + i, i);
cont.num = i; //"запоминаем" номер в контейнере верхнего уровня
//Создаем вложенный мувик-контейнер нижнего уровня, куда и будем грузить картинку.
//Это нужно, поскольку после загрузки содержимое контейнера стирается,
// а ведь нужно запомнить номер мувика.
var img:MovieClip = cont.createEmptyMovieClip('img', 0);
loader.loadClip(file, img);
}

function mcOnRelease ()
{
var cont:MovieClip = this._parent;
var i:Number = cont.num; //опять "вспоминаем" номер
trace('Нажали на мувик номер ' + i );
}


И забудьте совершенно про loadMovie, иначе так и будут вопросы - "почему то не работает, почему се не работает"

PS. Все должно заработать (единственное - я не моделировал ваш XML, пути к картинкам занес вручную).

forward
06.07.2010, 14:46
Вот я сделал, как Вы писали выше, отдельно этот кусок с XML и картинками но все равно не работает...:eek:

mooncar
06.07.2010, 14:53
Пересохраните для CS3.

mooncar
06.07.2010, 15:06
Собственно нашел пример, который я тогда сэмулировал для вашего случая. Только пути к картинкам просто генерируются: 1.jpg, 2.jpg и тд., а не берутся из xml-файла. Посмотрите, все в порядке, все работает.
Может быть у вас проблемы с разбором XML? Потрейсите...

Бармалейкин
09.07.2010, 00:17
Посоветуйте плиз, как лучше сделать? У меня похожая ситуация - гружу несколько картинок (их может быть от 10 до 1000). И потом мне нужно по 10 штук на странице их показывать. Т.е. два ряда по 5 картинок, в одном месте. Сразу все картинки для галереи не гружу, гружу только те что нужны для открытой страницы. А проблема вот в чём - сейчас я сделал 10 копий одного клипа (квадрат с рамочкой) куда и грузится картинка. Перелистывается страница - в те-же самые 10 квадратов грузятся новые 10 картинок. Листаешь назад - грузятся снова те что были ранее. Как-бы организовать загрузку так, чтобы не грузить картинки по нескольку раз а однажды загрузить их куда-то а потом просто копировать в тот мувик с рамкой? Что-то вроде библиотеки с attachMovie.

Подскажите хотя-бы в сторону чего копать?
Нужно куда-то загружать картинки чтобы потом можно было их копировать(?) в рамки на места.

mooncar
09.07.2010, 10:18
1) Можно оставить все как есть - то есть пусть они подгружаются всякий раз заново.
Дело в том, что если проект в сети лежит, то браузер после первой загрузки их закеширует.
2) Если все же хотите, то можно, загружая картинки, сразу отрисовывать их в битмапный массив, и добавлять по мере надобности в мувик с рамочкой с помощью attachBitmap.

rainbowrussia
09.07.2010, 14:57
Как-бы организовать загрузку так, чтобы не грузить картинки по нескольку раз а однажды загрузить их куда-то а потом просто копировать в тот мувик с рамкой?
+1, Не стоит так делать.

Бармалейкин
10.07.2010, 03:20
Как я понимаю, нужно делать так:

import flash.display.BitmapData;

// массив для битмапов
var aBitmapLst:Array= Array();

// загрузка картинки в битмапу
function load_pic(iIdx, sUrl, target)
{
var mcl:MovieClipLoader = new MovieClipLoader();
var Listener:Object = new Object();

Listener.onLoadInit = function(mc) {
aBitmapLst[iIdx]= new BitmapData(100, 100, false, 0x000000);
aBitmapLst[iIdx].draw(mc);
mc.attachBitmap(aBitmapLst[iIdx], 1, 'auto', true);
};

mcl.addListener(Listener);
mcl.loadClip(sUrl, target);
}

// запускаем загрузку и отрисовку
load_pic(1, '1.jpg', mc1);
load_pic(2, '2.jpg', mc2);
load_pic(3, '3.jpg', mc3);


А как теперь в mc3 вывести 1.jpg? Сделать
aBitmapLst[1].draw(mc3);
?

rainbowrussia
10.07.2010, 03:57
iIdx внутри onLoadInit будет имхо не определен.

Бармалейкин
11.07.2010, 19:11
Нет, trace показывает что всё нормально.
Но суть не в этом. Вот в итоге работы этого кода постепенно заполняется массив aBitmapLst объектами типа BitmapData, которые для вывода в MovieClip нужно потом draw() и attachBitmap() ? Вот этот шаманиз меня путает. Я думал что Draw для отрисовки картинки на клип достаточно но везде где я находил примеры готового кода используется ещё и attachBitmap. Зачем?
Ну и ещё столкнулся с неприятным. При работе, я проверяю загружена-ли уже эта картинка в массив или простым условием
if ( aBitmapLst[ iIdx ] == undefined ) {
// не загружена, загружаем
load_pic(iIdx, 'адрес катинки', клип_загрузки);
}
Но почему-то он не работает... Т.е. после первых 10 загруженных картинок всегда по условию получается что любой элемент массива отвечает как существующий и код перестаёт работать :( Как тут быть? Как проверить что элемент массива заполнен картинкой? Через typeof() или есть что-нибудь типа empty() / isset() из php?

mooncar
11.07.2010, 19:34
Я думал что Draw для отрисовки картинки на клип достаточно но везде где я находил примеры готового кода используется ещё и attachBitmap. Зачем?
Метод draw - это метод класса битмапы (BitmapData.draw method) - служит для заполнения вновь созданного экземпляра битмапы рисунком из мувика.
Метод attachBitmap - это метод класса MovieClip (MovieClip.attachBitmap method) - служит для заполнения мувиклипа картинкой из битмапы.
А как теперь в mc3 вывести 1.jpg? Сделать aBitmapLst[1].draw(mc3);
Нет. Нужно использовать как раз attachBitmap.

Бармалейкин
12.07.2010, 01:48
Ага, теперь я понял. Очевидную вещь не заметил :) Ведь после создания битмапа в массив он (битмап) ничем не заполняется, тут и нужен draw. А потом уже аттач для вывода на нужный мувик. Спасибо!
А как проверять элемент массива на загрузку битмапы?

mooncar
12.07.2010, 01:57
А как проверять элемент массива на загрузку битмапы?
А зачем? Заполняй элементы сразу гарантировано.
Загрузил картинку в контейнер - раз, дальнейшие действия только внутри onLoadInit: отрисовал его в битмапу - два, занес битмапу в массив - три, удалил или выгрузил контейнер - четыре.

Например если загрузки делаются циклом, то всю эту схему можно еще добавить к прелоадеру 1-го кадра. При этом нужно считать количество сработок onLoadInit. Если равно ожидаемому - переход в рабочий кадр, где все начинает работать.
Если сработает обработчик onLoadError - какие-то действия - индикация ошибки с указанием отсутствующей картинки и т.д.

Бармалейкин
12.07.2010, 02:20
Ну, дело в том, что это галерея и она состоит из нескольких страниц. А всего в этой галерее может быть очень много картинок, и посетитель не обязательно будет пролистывать все страницы галереи :) Поэтому я и хочу грузить только те картинки, страницы которых он откроет. Но раз он может вернутся обратно, на предыдущие страницы, то грузить в некий кэш - массив битмапов. Да, тут возникает некоторая неприятность - может так быть (на медленных соединениях) что если быстро туда-сюда попереключаться то возникнет несколько паралельно качающих одну и ту-же битмапу потоков. Но об этом я пока не думал, у меня пока с простым случаем не получается.

В итоге ншёл ошибку и исправил - попутал с индексами. Теперь обнаружился новый странный момент:
если запускать по F12 из флеша, то всё грузится,страницы листаются и вдно что при переходе назад картинки берутся из кэша (сразу появляются, без моргания) но вот если запустить этот флеш в браузере то вместо картинок рисуется посто квадрат зилитый цветом из параметра в "new BitmapData()". Я думал дело в правах на домен, ведь картинки качаются с другого сайта однако нет - без битмапы всё прекрасно грузится. И что окончательно меня добило - если в конце функции Listener.onLoadInit добавить строку mc._alpha= 50; то картинки появляются! Разумеется, полупрозрачные. Игра с альфой ни к чему не привела, при альфа 0 ничего нет даже пустого квадрата, при альфа 100 - только квадрат. Что за фигня проиходит? почему именно в браузере? Проверял в опере и мазиле - один и тот-же эффект. :( Правда у меня флеш 9, а в браузерах плеер 10.1, может поэтому?
В настройках флеша при экспорте стоит Flash 9, AS 2

mooncar
12.07.2010, 04:10
Бармалейкин, покажите текущий код.

Бармалейкин
12.07.2010, 19:34
Собственно вот две функции. Первая с битмапами и тот глюк что я описал, а вторая без битмапов и всегда грузит нормально (в браузере тоже)

function load_pic(mc_targ, i, sUrl)
{
var mcl:MovieClipLoader = new MovieClipLoader();
var Listener:Object = new Object();

Listener.onLoadInit = function(mc) {
aBitmapLst[i]= new BitmapData(90, 90, false, 0xE0E0E0);
aBitmapLst[i].draw(mc);
mc.attachBitmap(aBitmapLst[i], 10000, 'never', false);
};

mcl.addListener(Listener);
mcl.loadClip(sUrl, mc_targ);
}

function load_pic2(mc_targ, sUrl)
{
var mcl:MovieClipLoader = new MovieClipLoader();
mcl.loadClip(sUrl, mc_targ);
}


В первой функции была ошбка с индексом - он там был всегда от 0 до 9, т.е. индекс ячейки на странице. Теперь там именно номер картинки, и это решило проблему "загрузки первой страницы только". Параметр i. Остальные два параметра у этих функций одинаковые.
Вызов тоже простой:
// если картинка не загружена - грузим
if ( typeof(aBitmapLst[i])== 'undefined' ) {
load_pic(gal_list["img"+iIdx].pict, i, sLoadUrl);
} else {
gal_list["img"+iIdx].pict.attachBitmap(aBitmapLst[i], 1, 'auto', true);
}
// заполняем карточку
// load_pic2(gal_list["img"+iIdx].pict, sLoadUrl);

Тут gal_list - муфик с набором из 10 мест под картинки, соотв. это мувы img+номер, в каждом муве вложен Graphics с именем pict. Внего-то и грузится картинка. i - тут работает аналогично, это сковзной индекс/номер картинок в галерее а iIdx номер мува на странице.
Сегодня вечером попробую выкусить в отдельную флешку только галерею. Может так пойму в чём дело... да, эта флешка (с галереей) загружается моим-же лоадером. Но проблемы с путями к мувам нет, я поверял. Т.е. ещё одна разница между запуском в браузере и из флеша это то, что в браузере сперва грузится лоадер который грузит галерею.

mooncar
12.07.2010, 19:58
А как это для символа Graphic вы сумели задать инстанс-имя pict и загружать в него что-то? Или я что-то так не понял?
Еще я не могу усечь одну вещь - зачем вы отрисовываете из мувика битмапу, а потом тут же ею отрисовываете этот же мувик? (это в onLoadInit).

Насколько я понял логику проекта, вам нужно при переходе на какую-то страницу вызвать некую общую функцию.

Она проверит для каждой ячейки, есть или нет данные в битмапном массиве для конкретной картинки.

Если нужных данных в массиве нет, производится:
- загрузка картинки в соотв. ячейку
- отрисовка загруженного содержанием мувикав битмапный массив.

Если данные есть:
- происходит аттачмент битмапы из массива в мувик.

То есть две линии - либо загрузка + draw , либо attachBitmap.

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

Бармалейкин
13.07.2010, 00:44
Да, это часть большого проекта... поэтому всё я никак не могу выковырять часть чтобы можно было выложить тут, показать.
Логику вы поняли верно, так оно и делается. Насчёт аттача после draw я как-то недодумал. Убрал attachBitmap из onLoadInit - картинки начали появляться. Я уж обрадовался, но оказалось рано. При переходе на страницу назад рисуется задолбавший пустой квадрат. :(
Да, pict изначально был Graphic но для установки Linkage пришлось изменить его свойство на MovieClip, уже прикрепив его в тот мувик что выводит картинки. Это может влиять?

mooncar
13.07.2010, 01:52
Грузить можно только в мувик, исходите из этого.
Насчет логики, которую я выше описал - проверьте, соответствует ли?
Особое внимание уделить бы проверке существования элемента массива картиночного. Возможно у вас хромает логика и картинка не аттачится просто.
Но сейчас точно не скажу, тем более весь проект не виден.

Бармалейкин
13.07.2010, 02:08
Сделал из кусков кода микро-флешку с галереей. На странице по 3 картинки, грузятся пикчи с левого сайта, поэтому не в размер. Снизу сние кнопки влево-вправо листают страницы. Глюк повторён полностью - в флеше работает в браузере малевич.
В чём тут ошибка? Посмотрите пожалуйта, если не трудно.

mooncar
13.07.2010, 20:03
Немного запутался в вашем примере (там похоже есть незадействованные для этого примера переменные), но конечно нужно вытащить всю работу с MCL из функции, кроме, естественно, самой загрузки (loadClip).
Накидаю вам, как бы сделал я.

mooncar
13.07.2010, 22:35
Бармалейкин, вот вам переделанная галерейка с сохранением в битмапу во избежание повторных подгрузок картинок.
PS. В общем случае (если картинки разнородные), нужно писать
new BitmapData(mc._width, mc._height, ...
, а не
new BitmapData(100, 100, ...
, поскольку считывание будет производиться по реальному размеру загруженной картинки, невзирая на предварительные манипуляции с шириной и высотой контейнера. При такой записи считаются только первые 100 пикселей в ширину и высоту.

То есть:
- загрузили
- считали битмапу, занесли в массив
- настроили внешний вид картинки - размеры, центровку внутри контейнера
Таким в образом в битмапе хранится картинка оригинальных размеров.

Если нет желания грузить огромную картинку как есть и держать её такую в битмапе, в памяти, то подготовку картинки лучше выполнить на стороне сервера. Это заранее делается в скрипте PHP, который будет картинку отдавать флешке.

mooncar
14.07.2010, 01:39
Всё же есть косяк. Может быть кто-то осведомлен?

А именно. Вскрылась любопытная особенность.
Если картинка загружается с того же сервака, из его локальной папки, то все работает корректно - картинка считывается экземпляром MCL, далее с контейнера отрисовывается битмапа, далее она существует, содержит в себе картинку и аттачится куда нужно.
Если же картинки подгружаются с другого домена, то битмапа не отрисовывается, остается только заданный при ее создании фон.
По крайней мере с моим примером, исходник которого выше, так обстоит:
http://us-pro.ru/mooncar/galery/galery.html
Файлы с цветочками лежат локально на этом серваке, а вот аватар отсюда, то есть с домена www.flasher.ru
При первоначальной загрузке он загружается и показывается, но при попытке использовать данные битмапы вместо битмапы оказывается, что отрисована пустота на белом фоне.
С цветами же все ок.

Почему такое может быть?Неужели какие-то секьюрные нюансы? Ведь сама загрузка картинок идет.
Или какие-то косяки в реализации всё же есть?

PS. Отрисовка и аттач организованы элементарно, если кому лень в исходник залезать:
listener.onLoadInit = function(mc:MovieClip)
{
var i:Number = mc._parent.n; //вытаскиваем номер из родительского мувика
var bData:BitmapData = new BitmapData(mc._width, mc._height, false, 0xFFFFFF);
bData.draw(mc);
aBitmapLst[i] = bData;
};

mc.attachBitmap(aBitmapLst[i], 0, 'auto', false);