PDA

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


Prometei1599
07.02.2011, 20:40
Добрый вечер коллеги!
Задача состоит в следующем: необходимо из папки загрузить изображения в динамически создаваемые МувиКлипы.
Примерный код привожу ниже:

var mcl: MovieClipLoader = new MovieClipLoader();

var str:String = "img";
var mcName:String = "mc";
var v:Boolean = false;
var i:Number = 0;

do{
i++;
v = mcl.loadClip("images/"+str+i+".jpg", mcName+i);
}while(v == true)


Помогите пожалуйста разобраться с тем, как в этом цикле динамически создать МувиКлипы, чтобы можно было загружать в них изображения?

Заранее спасибо!

Hauts
07.02.2011, 21:34
function createLoaderClip(createTo, src) {
var d = createTo.getNextHighestDepth();
var newClip = createTo.createEmptyMovieClip("loaderClip_"+d, d);
var mcl = new MovieClipLoader();
var loadListener = {};
loadListener.onLoadInit = function(target_mc) {
trace("loaded! "+target_mc._width+"x"+target_mc._height);
};
mcl.addListener(loadListener);
mcl.loadClip(src,newClip);
return newClip;
}
for (var k = 0; k<10; k++) {
var newLoaderClip = createLoaderClip(_root, "http://www.flasher.ru/forum/images/russian/flasher_logo.gif");
newLoaderClip._y = k*80;
}


Держите простенький примерчик :)

Prometei1599
10.02.2011, 13:08
Снова здравствуйте!
Столкнулся с небольшой трудностью: mcl.loadClip(src,newClip); возвращает true всегда, даже при отсутствии изображения. Потом, правда, в консоли появляется сообщение о ошибке загрузки.
Может использовать mcl.onLoadError в качестве обработчика события?
Спасибо!

Hauts
10.02.2011, 13:27
Да, нужно использовать onLoadError у слушателя mcl.


function createLoaderClip(createTo, src) {
var d = createTo.getNextHighestDepth();
var newClip = createTo.createEmptyMovieClip("loaderClip_"+d, d);
var mcl = new MovieClipLoader();
var loadListener = {};
loadListener.onLoadInit = function(target_mc:MovieClip) {
trace("loaded! "+target_mc._width+"x"+target_mc._height);
};
loadListener.onLoadError = function(target_mc:MovieClip, errorCode:String, httpStatus:Number) {
trace(">> loadListener.onLoadError()");
trace(">> ==========================");
trace(">> errorCode: " + errorCode);
trace(">> httpStatus: " + httpStatus);
};
mcl.addListener(loadListener);
mcl.loadClip(src,newClip);
return newClip;
}
for (var k = 0; k<10; k++) {
var newLoaderClip = createLoaderClip(_root, "http://www.flasher.ru/forum/images/russian/flasher_logo.gif");
newLoaderClip._y = k*80;
}

Prometei1599
15.02.2011, 16:29
В продолжении темы добавлю:

var dx:Number = 120;
x_prelCoordinate = 4.5;
x_prewCoordinate = 4.5;
var mtrx = new Matrix();
mtrx.scale(1.0, 1.0);
var prevInstName:String = "";
var mcl:MovieClipLoader = new MovieClipLoader();

for(var i:Number = 1; i<=5; i++){
var d1 = _root.getNextHighestDepth();
prelInstName = "preloadClip_"+d1;
var newClip = _root.createEmptyMovieClip(prelInstName, d1);
mcl.loadClip("images/mno"+i+".jpg", newClip);
newClip._x = x_prelCoordinate;
x_prelCoordinate = newClip._x + dx;
newClip._y = 5;

var bmd = new BitmapData(100, 60, true, 0x00000000);
bmd.draw(newClip,mtrx,null,"normal",null,true);
var d2 = roll.getNextHighestDepth();
prewInstName = "prewievClip_"+d2;
roll.createEmptyMovieClip(prewInstName, d2);
roll[prewInstName].attachBitmap(bmd, d2, "auto", true);
mcl.loadClip("images/mno"+i+".jpg", roll[prewInstName]);
roll[prewInstName]._x = x_prewCoordinate;
x_prewCoordinate = roll[prewInstName]._x + dx;
roll[prewInstName]._y = 5;
}

В итоге получается, что изображения разных размеров как в превью, так и без превью отображаются одинаково.
Помогите пожалуйста найти ошибку в коде!
Заранее спасибо!

Hauts
15.02.2011, 17:33
Что вы хотите сделать? Я вот что-то не могу сообразить по вашему коду.

Prometei1599
15.02.2011, 18:25
Цель: в гелерее сделать "превью", состоящее из изображений одного размера(допустим 100 на 60), в то время как оригиналы изображений разного размера.
В этом коде я хотел сравнить оригиналы загружаемых изображений(наверху) и увидеть результат создания "превью"(внизу). Но в результате как наверху оригинал, так и внизу.

Hauts
15.02.2011, 18:32
Понятно.

Для начала вам необходимо загрузить изображения. После их полной загрузки отрисовать их в битмапдаты — в одну для превьюшки, вторую для полноразмерной картинки. И уже после этого показывать их. Для каждого изображения вам потребуется свой MovieClipLoader, чтобы ловить события загрузки.


var newClip = _root.createEmptyMovieClip(prelInstName, d1);
mcl.loadClip("images/mno"+i+".jpg", newClip);
newClip._x = x_prelCoordinate;
x_prelCoordinate = newClip._x + dx;
newClip._y = 5;

var bmd = new BitmapData(100, 60, true, 0x00000000);
bmd.draw(newClip,mtrx,null,"normal",null,true);


Вот тут принципиальная ошибка. newClip на момент, когда вы вызываете bmd.draw(newClip,mtrx,null,"normal",null,true) является пустым, картинка в него еще не загрузилась.

И еще добавлю: Не стоит "нагромождать" код. Пишите функции под конкретные нужды. Сейчас у вас идет куча разнотипных действий и несколько схожих переменных (prelInstName, prewInstName, prevInstName) — это сложно понять и сложно в этом разобраться.

mooncar
15.02.2011, 19:35
Hauts, а зачем столко MovieClipLoader'ов? Вполне достаточно одного, ровно как и обработчика тоже. В обработчике onLoadInit всегда есть ссылка на контейнер, куда загружали изображение. В цикле только создание контейнера и loadClip и всё, то что действительно уникально.

Hauts
15.02.2011, 20:15
Опс, согласен, я ошибся. Про это как-то не подумал.

Prometei1599
16.02.2011, 14:34
Еще раз прошу меня простить великодушно, но после исправления кода, "превью" не грузится все равно:

import flash.display.BitmapData;
import flash.geom.Matrix;

var dx:Number = 120;
x_prelCoordinate = 4.5;
x_prewCoordinate = 4.5;
var mtrx = new Matrix();
mtrx.scale(1.0, 1.0);
var prevInstName:String = "";
var mcl:MovieClipLoader = new MovieClipLoader();
var listener:Object = new Object();
mcl.addListener(listener);

for(var i:Number = 1; i<=5; i++){
var d1 = _root.getNextHighestDepth();
prelInstName = "preloadClip_"+d1;
var newClip = _root.createEmptyMovieClip(prelInstName, d1);
mcl.loadClip("images/mno"+i+".jpg", newClip);
newClip._x = x_prelCoordinate;
x_prelCoordinate = newClip._x + dx;
newClip._y = 5;
trace(newClip);
}


listener.onLoadInit = function(target_mc){
var bmd = new BitmapData(100, 60, true, 0x00000000);
bmd.draw(target_mc,mtrx,null,"normal",null,true);
var d2 = roll.getNextHighestDepth();
prewInstName = "prewievClip_"+d2;
roll.createEmptyMovieClip(prewInstName, d2);
roll[prewInstName].attachBitmap(bmd, d2, "auto", true);
roll[prewInstName]._x = x_prewCoordinate;
x_prewCoordinate = roll[prewInstName]._x + dx;
roll[prewInstName]._y = 5;
}


Все заработало! Причина была в импорте пакетов BitmapData и Matrix.
Тему можно закрывать!=)