Просмотр полной версии : Загрузка и присоединение картинок
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? Не хочется совершать лишние телодвижения.
Не очень ясна задача. Предзагрузку сделать не проблема. Позиционировать тоже. Но что значит "отображать 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)-ого я сомневаюсь. Я не флешер, поэтому возможно запутался в каких-то элементарных вещах, отсюда и вопрос.
если для 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)?
to vecalion:
боюсь показаться слишком умным =), но 2-ой способ отлично работает... при некоторых условиях =)
Итак:
Грузишь картинки в невидимые (находящиеся за сценой или _visible = false) мувики.
Делаешь мувик, который будет отображать эти картинки (следишь за его координатами, если тебе надо, и т.д.).
Невидимые мувики после загрузки картинок просто-напросто удаляешь.
И всё. Грузишь по нажатию на кнопку нужную картинку в тот самый мувик, что создал для этого.
Фишка: CACHE ON!
Если ты не используешь при загрузке картинок приёмы, запрещающие их кэширование, то, я думаю, доли секунды, которые потребуются браузеру, чтоб достать из кэша твои картинки -- вполне приемлемая цена за то, чтоб обойтись без использования 8-го Флэша.
nyctota предложил хороший вариант, я тоже в большинстве проектов так делаю %))), хотя бывают делал и такой вариант( работает для большинства случаев, и немного геморно бывает с координатами):
создаютется нужное для картинок число мувиков которые лепяться к руту, ну или в какой нить мувик к которому потом могут "достучаться", мувики "контейнеры", и этим "контейнерам" , передаеться ссылка не на саму картинку, а на мув прикрепленный к руту, и контейнер делает с ним свои дела %))
2 silin
Слушай... я новичок... у меня не получается это сделать, как в твоём коде... можешь дать fla файл посмотреть... нужная вещь, пытаюсь реализовать, а сделать не могу... подсказать некому...
silin, подскажи плиз если не трудно как это всё использовать. Я пока ещё в темноте, а так хочется к свету. Если конкретно то как это всё размещать. Было бы супер если бы исходник. Для развития это супер. Заранее спасибо.
я же показал..,
или вы думаете что во фла что-то иначе..
Посмотрел, спасибо ты был прав понятнее не стало. Кроме того у тебя завязано на клике и случайном выборе публикуемых координат. А если нужно что бы в последствии подгружалось в мувик "image1, mage2 ..." в определённом месте как их привязать, вернее какой синтаксис в данном мувике без кликов для вывода картинки 01... 02..?
Silin, а если такая ситуация: через твой класс загрузили картинки, а затем идёт анимация, допустим одна картинка, потом вторая картинка, третья... вопрос в следующем: как привязать первую, 2, 3 картинки к этим мувикам которые публикуются под анимированными масками?
не надо усложнять:
есть массив битмапов (его и создает класс)..
а дальше делай с ними(битмапами) что тебе надо : аттач в мувики(расположенные в определенном месте или не очень определенном, под маской или без и т.д.), меняй, трансформируй..
2 silin
Слушай.... а может сделать в класс ещё переменные total, loaded, total_img (количество картинок) и loaded_img (количество уже загруженных картинок)? Чтоб в прелоадерах использовать. у меня не получается чего-то...
не знаю, что и сказать: конечно можно..
если тебе удобнее хранить длину массива в классе или окончание определять флагом - ничто ж не мешает так и сделать..
Да как раз кол-во картинок не так важно... важнее сделать кол-во загруженных байт, всего байт.... чтоб прелоадер сделать.... у меня почему-то, не получается.... ошибку не пишет, но и не работает правильно
попробуй так:
грузим все картинки с помощью MovieClip.loadMovie во временные мувики
по enterFrame (или setInterval) суммируем getBytesLoaded/getBytesTotal мувиков..
дальше, думаю, понятно..
да вроде понятно... я так и пробовал делать.... да не получается... ладно попробую дабить это... если что - буду вопросы задавать...
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;
}
}
что у тебя происходит из этого куска кода не понять..
вариантов на самом деле может быть много,
я бы так сделал:
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 раза
Да, решение хорошее... Только почему-то не понятно: когда просто просмотр нажимаешь - пишет:
0/0
все..
И по нажатию не показывает картинок...
Ну я думаю это мелочь, так как по любому будет загружаться не мгновенно!
А решение onProgress(l,t), мне понравилось :)
Слушай, а что означает n%=pl.length;? в часности (n%)
>>пишет 0/0 ..И по нажатию не показывает картинок...
видимо условия if(bt>0 && bl==bt) недостаточно..
>>то означает n%=pl.length;?
n=n%pl.length
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.