PDA

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


vecalion
04.01.2006, 18:47
someclass {
private var display:MovieClip;

private var m1:MovieClip;
private var m2:MovieClip;

public void someMethod():Void
{
display = _root.createEmptyMovieClip("display",1);
display._x = 10;
display._y = 10;
...

loadMovie("image1.jpg", m1);
loadMovie("image2.jpg", m2);
...
}
}

Надо сделать некую предзагрузку картинок. Можно ли каким-то образом отобразить содержимое, к примеру, m1 на мувике display? Либо надо для отображения каждый мувик присоединять к _root, ставить на нужное место и менять _visible? Не хочется совершать лишние телодвижения.

Antares
04.01.2006, 19:05
Не очень ясна задача. Предзагрузку сделать не проблема. Позиционировать тоже. Но что значит "отображать m1 на мувике display" -- ? Поместить внутрь него нельзя -- только загружать в заранее соданный в нем.

К слову говоря, в AS3 можно любой визуальный объект прицепить любому -- очень удобно :)

vecalion
05.01.2006, 13:10
Не очень ясна задача. Предзагрузку сделать не проблема. Позиционировать тоже. Но что значит "отображать m1 на мувике display" -- ? Поместить внутрь него нельзя -- только загружать в заранее соданный в нем.

К слову говоря, в AS3 можно любой визуальный объект прицепить любому -- очень удобно :)
Попытаюсь объяснить задачу. Необходимо, чтобы флеш ролик отображал некие загружаемые с сервера объекты (текст + картинка). Отображение происходит по одному объекту. Смена объектов либо по таймауту, либо по желанию пользователя (Next). Для того, чтобы уменьшить нагрузку на сервер, а также чтобы не заставлять пользователя ждать при мануальной смене картинок, был выбран следующий алгоритм: при инициализации, ролик запрашивает с сервера 2 * n объектов. В последующем, после показа n объектов, ролик подгружает еще n объектов.

Для хранения загруженных объектов в памяти можно использовать 2 массива - массив строк для текста и массив мувиков для картинок. Если при отображении объекта для массива текста всё ясно, то для массива мувиков не совсем...

Можно:

1) создать n мувиков, используя createEmptyMovieClip(), выставить им _visible = false, загрузить в них картинки, и при отображении прятать предыдущий мувик, вычислять и выставлять следующему мувику правильные координаты (ибо они постоянно динамически изменяются), показывать его.

2) (то, что я коряво пытался объяснить в первом посте) объявить n мувиков, загрузить в них требуемые картинки, создать один мувик привязанный к какой-то шкале, который сам будет следить и передвигаться в нужные координаты, и при отображении - копировать/переносить/ещечтото мувик с картинкой из памяти в отображаемый мувик

Если (1) реализуемо, но не очень красиво, то на счет реализуемости (2)-ого я сомневаюсь. Я не флешер, поэтому возможно запутался в каких-то элементарных вещах, отсюда и вопрос.

silin
05.01.2006, 15:04
если для 8-ки и подгружаем только изображения, то можно такой подход:
-грузим во временные мувики картинки из переданного массива урлов
-изображение копируем в BitmapData,кладем ссылку в массив, мувики удаляем
-как загрузятся все, вызываем метод onLoad
дальше по мере надобности аттачим из массива нужный битмап куда надо..
import flash.display.*;
class Someclass {
private var images:Array=[];
public var onLoad:Function;
public var length:Number;
//грузим, копируем, удаляем
public function load(urls:Array){
images=[];
length=urls.length;
var o=this;
for(var counter=length,i=length;i--;){
var ml =new MovieClipLoader();
ml.tag=i;
ml.mc=_root.createEmptyMovieClip('tmp'+i,_root.getNextHighestDepth());
ml.imgs=images;

ml.onLoadInit=function(){
var bmp=this.imgs[this.tag]=new BitmapData(this.mc._width,this.mc._height);
bmp.draw(this.mc);
this.unloadClip(this.mc);
this.mc.removeMovieClip();
if(!--counter)o.onLoad();
}
ml.loadClip(urls[i],ml.mc);
}
}
//аттачим битмап в мувик where( для примера..
public function displayImage(where:MovieClip,num:Number){
where.attachBitmap(images[num],where.getNextHighestDepth());
}
}
///////////////пример/////////////
var imageLoader=new Someclass();
imageLoader.load(['p0.jpg','p1.jpg']);
imageLoader.onLoad=function(){
//trace('loaded');
_root.onMouseUp=function(){
var mc=this.createEmptyMovieClip('tmp',this.getNextHighestDepth())

mc._x=random(Stage.width);
mc._y=random(Stage.height);
imageLoader.displayImage(mc,random(imageLoader.length));
}

}

vecalion
05.01.2006, 15:33
если для 8-ки и подгружаем только изображения, то можно такой подход...

Ага, нечто подобное я и искал! Спасибо. А для 7-ки остается только использовать что-то вроде того, что я описал в предыдущем посте под номером (1)?

nyctota
05.01.2006, 16:38
to vecalion:

боюсь показаться слишком умным =), но 2-ой способ отлично работает... при некоторых условиях =)

Итак:

Грузишь картинки в невидимые (находящиеся за сценой или _visible = false) мувики.
Делаешь мувик, который будет отображать эти картинки (следишь за его координатами, если тебе надо, и т.д.).
Невидимые мувики после загрузки картинок просто-напросто удаляешь.

И всё. Грузишь по нажатию на кнопку нужную картинку в тот самый мувик, что создал для этого.

Фишка: CACHE ON!

Если ты не используешь при загрузке картинок приёмы, запрещающие их кэширование, то, я думаю, доли секунды, которые потребуются браузеру, чтоб достать из кэша твои картинки -- вполне приемлемая цена за то, чтоб обойтись без использования 8-го Флэша.

__i
05.01.2006, 17:00
nyctota предложил хороший вариант, я тоже в большинстве проектов так делаю %))), хотя бывают делал и такой вариант( работает для большинства случаев, и немного геморно бывает с координатами):

создаютется нужное для картинок число мувиков которые лепяться к руту, ну или в какой нить мувик к которому потом могут "достучаться", мувики "контейнеры", и этим "контейнерам" , передаеться ссылка не на саму картинку, а на мув прикрепленный к руту, и контейнер делает с ним свои дела %))

Vasik1
19.04.2006, 12:08
2 silin
Слушай... я новичок... у меня не получается это сделать, как в твоём коде... можешь дать fla файл посмотреть... нужная вещь, пытаюсь реализовать, а сделать не могу... подсказать некому...

timasik
19.04.2006, 13:13
silin, подскажи плиз если не трудно как это всё использовать. Я пока ещё в темноте, а так хочется к свету. Если конкретно то как это всё размещать. Было бы супер если бы исходник. Для развития это супер. Заранее спасибо.

silin
19.04.2006, 13:56
я же показал..,
или вы думаете что во фла что-то иначе..

timasik
19.04.2006, 14:03
Посмотрел, спасибо ты был прав понятнее не стало. Кроме того у тебя завязано на клике и случайном выборе публикуемых координат. А если нужно что бы в последствии подгружалось в мувик "image1, mage2 ..." в определённом месте как их привязать, вернее какой синтаксис в данном мувике без кликов для вывода картинки 01... 02..?

timasik
19.04.2006, 14:07
Silin, а если такая ситуация: через твой класс загрузили картинки, а затем идёт анимация, допустим одна картинка, потом вторая картинка, третья... вопрос в следующем: как привязать первую, 2, 3 картинки к этим мувикам которые публикуются под анимированными масками?

silin
19.04.2006, 15:04
не надо усложнять:
есть массив битмапов (его и создает класс)..
а дальше делай с ними(битмапами) что тебе надо : аттач в мувики(расположенные в определенном месте или не очень определенном, под маской или без и т.д.), меняй, трансформируй..

timasik
19.04.2006, 15:17
спасибо

Vasik1
21.04.2006, 16:28
2 silin

Слушай.... а может сделать в класс ещё переменные total, loaded, total_img (количество картинок) и loaded_img (количество уже загруженных картинок)? Чтоб в прелоадерах использовать. у меня не получается чего-то...

silin
21.04.2006, 19:20
не знаю, что и сказать: конечно можно..
если тебе удобнее хранить длину массива в классе или окончание определять флагом - ничто ж не мешает так и сделать..

Vasik1
24.04.2006, 08:29
Да как раз кол-во картинок не так важно... важнее сделать кол-во загруженных байт, всего байт.... чтоб прелоадер сделать.... у меня почему-то, не получается.... ошибку не пишет, но и не работает правильно

silin
24.04.2006, 09:23
попробуй так:
грузим все картинки с помощью MovieClip.loadMovie во временные мувики
по enterFrame (или setInterval) суммируем getBytesLoaded/getBytesTotal мувиков..
дальше, думаю, понятно..

Vasik1
24.04.2006, 11:10
да вроде понятно... я так и пробовал делать.... да не получается... ладно попробую дабить это... если что - буду вопросы задавать...

Vasik1
24.04.2006, 12:41
2 silin
Слушай, помоги пожалуйста... что-то не получается...
Видимо из-за того что мувики удаляются или чёрт знает... максимум у меня в загрузчике около 1% показывалось, а потом глюки видимо... Думаю, я просто не в ту степь иду... Конечно, так нельзя, надо самому думать, но не мог бы ты написать, реализацию прелоадера?

Ну вот смотри... простейшие вещи не получаются

this.createTextField('tf',200,0,0,1000,100);//где посмотрим
imageLoader.enterFrame=function(){
var t=0;
var l=0;
for (var i = 0; i<3; i++) {
t=t+_root["tmp"+i].getBytesTotal();
l=l+_root["tmp"+i].getBytesLoaded();
}
tf.text='Загрузка картинок '+l+' из '+t;
if(t>0 && l==t){
tf.removeTextField();

gotoAndPlay(2);
// delete this.onEnterFrame;


}

}

silin
24.04.2006, 14:32
что у тебя происходит из этого куска кода не понять..
вариантов на самом деле может быть много,
я бы так сделал:
import flash.display.BitmapData;
class PicLoader {
var images=[],loaders=[];
var length,intrv;
var addListener,broadcastMessage;
function PicLoader(){
AsBroadcaster.initialize(this);
}
function load(urls){
images=[];
length=urls.length;
for(var i=length;i--;){
var l=loaders[i]=_root.createEmptyMovieClip('tmp'+i,_root.getNextHighestDepth());
l._x=2000;
l.loadMovie(urls[i]);
}

intrv=setInterval(this,"loadControl",50);
}
function loadControl(){
for(var i=length,bl=0,bt=0;i--;){
bt+=loaders[i].getBytesTotal();
bl+=loaders[i].getBytesLoaded();
}

if(bt>0 && bl==bt){
clearInterval(intrv);
for (var i=length;i--;) {
var l=loaders[i];
images[i]=new BitmapData(l._width,l._height);
images[i].draw(l);
l.removeMovieClip();
}

broadcastMessage('onPicsLoad');

}else {
broadcastMessage('onProgress',bl,bt);
}
}
}
смотрим-проверяем
var picsUrl=["p0.jpg","p1.jpg","p2.jpg"];//url картинок
var pl=new PicLoader();
pl.addListener(this);
function onProgress(l,t){
trace(l+"/"+t);//здесь вывод информации о загрузке
}
function onPicsLoad(){
trace("все..");
//дальлше только для проверки: по клику будем аттачить по очереди катринки в рут
var n=0;
onMouseUp=function(){
_root.attachBitmap(pl.images[n++],0);
n%=pl.length;
}
}
////////////////
pl.load(picsUrl);//запускаем загрузку
//Ctrl-Enter 2 раза

Vasik1
24.04.2006, 14:56
Да, решение хорошее... Только почему-то не понятно: когда просто просмотр нажимаешь - пишет:
0/0
все..
И по нажатию не показывает картинок...
Ну я думаю это мелочь, так как по любому будет загружаться не мгновенно!

А решение onProgress(l,t), мне понравилось :)

Vasik1
24.04.2006, 14:57
Слушай, а что означает n%=pl.length;? в часности (n%)

silin
24.04.2006, 15:06
>>пишет 0/0 ..И по нажатию не показывает картинок...
видимо условия if(bt>0 && bl==bt) недостаточно..
>>то означает n%=pl.length;?
n=n%pl.length