Просмотр полной версии : Почему в MovieClipLoader не аттачится клип?
джонатан
01.09.2008, 20:17
Приветствую вас, уважаемые товарищи! Помогите пожалуйста с проблемой разобраться.
Короче! Есть MovieClipLoader, а при onLoadStart я хочу аттачить клип с прелоадером, чтобы отображать процесс загрузки во время onLoadProgress.
Но вот почему-то не грузится ничего! Как же быть?? В самом клипе я прелоадер нарисовать немогу, т.к. он создается динамически.
Вот код:
var mcl:MovieClipLoader = new MovieClipLoader();
var mclL:Object = new Object();
mcl.addListener(mclL);
mclL.onLoadStart = function(target:MovieClip) {
target.attachMovie("prel", "preloader", this.getNextHighestDepth());
}
mclL.onLoadProgress = function(target:MovieClip, loaded:Number, total:Number) {
trace(target.preloader) // Выводит "undefined" :(
}
mclL.onLoadInit = function(target:MovieClip) {
target.realWidth = target._width;
target.realHeight = target._height;
target.flagLoaded = true;
target._width = prevWidth;
target._height = prevHeight;
indexMC = Number(target._name);
target._x = indexMC*(prevWidth+LV)+prevX;
target._y = prevY;
target._visible = false;
orderedVisualization(target);
if (imgCounter==loaderVars.allImages) {
mcl.removeListener(mclL);
delete mclL;
delete mcl;
Start();
}
imgCounter++;
}
function loadImg() {
for (var i:Number = 0; i<=loaderVars.allImages-1; i++) {
preview_mc.createEmptyMovieClip(i, preview_mc.getNextHighestDepth());
preview_mc[i].flagLoaded = false;
mcl.loadClip("photos/"+(i+1)+".jpg", preview_mc[i]);
}
loadImg();
Благодарю за внимание!
Вы про контейнеры когда-нибудь слышали? Грузить клип надо в пустой мувик, который находится в контейнере. В этом контейнере сохранять нужные параметры, аттачить в него маски, прелоадеры и прочее. Не трогайте клип, в который грузите! Его нет, пока загрузка не закончится.
var mcl:MovieClipLoader = new MovieClipLoader();
var mclL:Object = new Object();
mcl.addListener(mclL);
mclL.onLoadStart = function(target:MovieClip) {
target._parent.attachMovie("prel", "preloader", this.getNextHighestDepth());
}
mclL.onLoadProgress = function(target:MovieClip, loaded:Number, total:Number) {
trace(target._parent.preloader) // Выводит "undefined"
}
mclL.onLoadInit = function(target:MovieClip) {
target.realWidth = target._width;
target.realHeight = target._height;
target.flagLoaded = true;
target._width = prevWidth;
target._height = prevHeight;
indexMC = Number(target._name);
target._x = indexMC*(prevWidth+LV)+prevX;
target._y = prevY;
target._visible = false;
orderedVisualization(target);
if (imgCounter==loaderVars.allImages) {
mcl.removeListener(mclL);
delete mclL;
delete mcl;
Start();
}
imgCounter++;
}
function loadImg() {
for (var i:Number = 0; i<=loaderVars.allImages-1; i++) {
preview_mc.createEmptyMovieClip(i, preview_mc.getNextHighestDepth());
preview_mc[i].flagLoaded = false;
mcl.loadClip("photos/"+(i+1)+".jpg", preview_mc[i]);
}
loadImg();pS А вообще зря я чтото в Вашем коде стал писать, там надо все переписывать на контейнеры. Может со временем поймете, в чем удобство, сейчас Вам конечно кажется что это лишние клипы и проч.
джонатан
02.09.2008, 12:36
Я так уже пробовал, у меня сразу флеш вылетает какого-то хрена... Я подумал что что-то там неладное просто происходит. :D
// update
И на других компах вылетает... А вот когда я сделал так:
mclL.onLoadStart = function(target:MovieClip) {
target._parent.createEmptyMovieClip("mc", 100);
target._parent.mc.attachMovie("prel", "preloader", this.getNextHighestDepth());
}
то все стало нормально. Как думаете, что же это может быть то такое?
В первом посте: ты пытаешься засунуть мувик prev в контейнер, в который грузится изображение, что бесполезно.
В коде из второго поста в обработчике onLoadStart, this указывает на mclL, т.е. this.getNextHighestDepth() возвращает undefined, а в метод attachMovie(), в качестве параметра глубины, передается NaN вместо положенного integer, и он поэтому аттачит мувик "prel" loaderVars.allImage раз на нулевую глубину, вымещая при этом первый контейнер с изображением. Остальлные картинки должны грузиться нормально.
В варианте номер три, ты создаешь мувик mc, для аттача в него prev, на 100 глубине, поэтому не стираешь первый контейнер с изображением, следовательно, все картинки нормально загружаются. prev при этом трижды аттачится в mc, на 0 глубину непонятно зачем.
udaaff : А почему трижды?
джонатан : не надо пихать this.getNextHighestDepth() везде. Если у Вас пустой, только что созданный, мувик, нет никакого смысла искать в нем "следующую свободную глубину" - они все свободны. К тому же, если еще плохо представляете себе области видимости функций, описанные udaaff ошибки почти неизбежны)) Конечно не надо создавать еще один контейнер в контейнере, теперь для прелоадера. Есть один контейнер, в нем - клип в который грузится картинка и в нем же - аттачится прелоадер. Считайте, что Вы вставляете картину в рамку. У рамки может быть стекло (маска), паспарту, этикетка и т.п. Эта картина в рамке - один объект, который Вы можете дальше использовать - повесить на стену, поставить на стол...
Что касается кода - как я уже сказал, начал было исправлять, но понял что силов не хватит. Поэтому придерусь к кускам -
mclL.onLoadStart = function(target:MovieClip) {
target._parent.attachMovie("prel", "preloader", target.getDepth()+2);
}Вот это выделенное не имеет смысла - флаг НЕ СОХРАНИТСЯ!
function loadImg() {
for (var i:Number = 0; i<=loaderVars.allImages-1; i++) {
preview_mc.createEmptyMovieClip(i, preview_mc.getNextHighestDepth());
preview_mc[i].flagLoaded = false;
mcl.loadClip("photos/"+(i+1)+".jpg", preview_mc[i]);
}
} // - разве здесь не должна быть скобка? у Вас нет.
loadImg();
И да, там где я вставлял _parent - предполагалось что будет создан контейнер.
udaaff : А почему трижды?
Не знаю почему трижды :confused: В уме серию из трех картинок проигрывал )) Наверное, поэтому.
Трижды, в смысле, loaderVars.allImages раз :)
джонатан
03.09.2008, 12:18
} // - разве здесь не должна быть скобка? у Вас нет.
loadImg();
Ндааа... Куда-то она запропастилась... Даже и не знаю куда! Но на самом деле не важно, это я просто тут опечатался...
Ну что ж. Спасибо вам. Вродебы понял в чем беда. Но я уже сделал иначе, а переделать - нет времени, по крайней мере пока. еще много чего предстоит сделать.
Вот так вот у меня получилось:
mclL.onLoadStart = function(target:MovieClip) {
target._parent.createEmptyMovieClip("mc", 100);
target._parent.mc.attachMovie("prel", "preloader", this.getNextHighestDepth());
target._parent.mc._y = (prevHeight / 2) - (target._parent.mc._height / 2) ;
if(prelN > 0) {
target._parent.createEmptyMovieClip("mc", 100);
target._parent.mc._x = (prevWidth * prelN) + (LV * prelN);
target._parent.mc.attachMovie("prel", "preloader", this.getNextHighestDepth());
target._parent.mc._y = (prevHeight / 2) - (target._parent.mc._height / 2) ;
}
}
mclL.onLoadProgress = function(target:MovieClip, loaded:Number, total:Number) {
loading = Math.round(loaded / total * 100);
target._parent.mc.preloader.gotoAndStop(loading);
target._parent.mc.preloader.progress_txt.text = loading + "%";
}
mclL.onLoadComplete = function(target:MovieClip) {
prelN ++;
}
mclL.onLoadInit = function(target:MovieClip) {
target._parent.mc.removeMovieClip();
target.realWidth = target._width;
target.realHeight = target._height;
target.flagLoaded = true;
target._width = prevWidth;
target._height = prevHeight;
indexMC = Number(target._name);
target._x = indexMC*(prevWidth+LV)+prevX;
target._y = prevY;
target._visible = false;
orderedVisualization(target);
if(fotoNum == 0) {
renderBMP(preview_mc[fotoNum]);
fotoNum++;
photo_txt.text = fotoNum + "/" + loaderVars.allImages;
}
if (iZ <= loaderVars.allImages-1) {
loadImg();
} else if (imgCounter==loaderVars.allImages) {
mcl.removeListener(mclL);
delete mclL;
delete mcl;
}
imgCounter++;
}
Еще раз спасибо!
И зачем два раза повторять? Вы ведь не сообщение повторяете, Вы клипы аттачите.
mclL.onLoadStart = function(target:MovieClip) {
target._parent.createEmptyMovieClip("mc", 100);
target._parent.mc.attachMovie("prel", "preloader", this.getNextHighestDepth());
target._parent.mc._y = (prevHeight / 2) - (target._parent.mc._height / 2) ;
if(prelN > 0) {
target._parent.createEmptyMovieClip("mc", 100);
target._parent.mc._x = (prevWidth * prelN) + (LV * prelN);
target._parent.mc.attachMovie("prel", "preloader", this.getNextHighestDepth());
target._parent.mc._y = (prevHeight / 2) - (target._parent.mc._height / 2) ;
}
}Строчки, выделенные желтым просто не нужны. Нет, не "просто" не нужны, а ДОЛЖНЫ быть удалены из кода.
И вот опять this.getNextHighestDepth() ! Вам ведь объяснили, что this здесь - экземпляр листенера, у него вообще никакой глубины нет. mc - только что созданный ПУСТОЙ мувик, аттачте на глубину 1 и не мучайте плеер дайвингами на мели.
Все было бы проще если бы вы ему не советовали принимая его ошибки как должное. А показали бы действительно правильный и вазможно даже красивый код... Зачем создавать вообще этот листенер? >_>
Так человек ничему не научится. Просто не захочет ничему учиться - приходи да бери. Пусть разбирается. Рабочий (не говорю "красивый")) пример я давал тут: http://flasher.ru/forum/showpost.php?p=745949&postcount=10
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.