PDA

Просмотр полной версии : непонятный глюк с MovieClipLoader()


divinus
05.05.2007, 19:46
Здравствуйте.
Суть проблемы в следующем...
Есть галерея, которая динамически исходя из xml-данных грузит из вне картинки, текст, и т.д.
Реализована данная система при помощи MovieClipLoader'а
вот код для конечного клипа который именно производит загрузку:


stop();
var baseUrl:String = "http://samedomain/gallery/small/";
//************************
loadURL - присваивается при attach'е данного клипа в клип скроллинга
************************//
var loaderListener:Object = new Object();
var imageClip = makeNewImageClip(0, 0);
var imageLoader = new MovieClipLoader();
imageLoader.addListener(loaderListener);
imageLoader.loadClip(baseUrl+loadURL, imageClip.holderClip);
loaderListener.onLoadProgress = function(holderClip:MovieClip, loadedBytes:Number, totalBytes:Number):Void {
var progressClip:MovieClip = holderClip._parent.progressClip;
var percent:Number = Math.round((loadedBytes/totalBytes)*100);
progressClip.indicatorClip._xscale = percent;
progressClip.progressText.text = percent+"%";
};
loaderListener.onLoadInit = function(holderClip:MovieClip):Void {
_root.gallery.imagesload++;
holderClip._parent.progressClip._visible = false;
holderClip._x = 0;
holderClip._y = 0;
};
function makeNewImageClip(x:Number, y:Number):MovieClip {
var depth:Number = this.getNextHighestDepth();
var imageClip:MovieClip = this.createEmptyMovieClip("imageClip"+depth, depth);
imageClip.createEmptyMovieClip("holderClip", 1);
var progressClip:MovieClip = imageClip.createEmptyMovieClip("progressClip", 2);
progressClip.createEmptyMovieClip("indicatorClip", 1);
progressClip.createTextField("progressText", 2, 0, 10, 85, 25);
progressClip.progressText.text = "соединямся";
progressClip.indicatorClip.lineStyle(0, 0, 0);
progressClip.indicatorClip.beginFill(0xEEEEEE, 100);
progressClip.indicatorClip.lineTo(85, 0);
progressClip.indicatorClip.lineTo(85, 64);
progressClip.indicatorClip.lineTo(0, 64);
progressClip.indicatorClip.lineTo(0, 0);
progressClip.indicatorClip.endFill();
progressClip._x = 0;
imageClip._x = 0;
imageClip._y = 0;
return imageClip;
}


если я при помощи Alt+Enter запускаю компиляцию в среде разработки, все нормально работает, но если закрыть окно проигрывания, не дождавшись загрузки рисунков до конца (прервать загрузку)... flash - выдает системную ошибку и вылетает...

подскажите пожалуйста, кто сталкивался с такой проблеммой, что я делаю не так?

etc
05.05.2007, 19:57
Переустанови флеш.

divinus
05.05.2007, 20:04
__etc, в первую очередь попробовал... не помогает...
а сейчас еще одну проблему нашел... не грузится ничего, если запускать на сайте... (хотя в дебагере системном, из интернета все отлично грузится)

etc
05.05.2007, 20:06
Проверяй, все ли в порядке с секьюрити.

divinus
05.05.2007, 20:18
__etc, System.security.allowDomain("www.mydomain.ru"); так похоже? :)
я 5 лет занимаюсь уже флешем... :) и пример кода я привел - сильно упростив... но проблема именно с MovieClipLoader...
в реальной галерее, есть универсальный класс, для загрузчика контента... любого...
раньше когда все было на классах, все работало как часы... а сейчас мне нужно написать ету фичу не использовав ООП... я сделал так...
1. грузятся данные (там точно проблем нет...)
2. если все ок, компануется клип, в котором по вертикали атачатся клипы-загрузчики... они имеют статичную высоту (зачем, скажу ниже)
3. клип созданный на пред. этапе обрастает вот таким скриптом:
(это система прокрутки, работает как часы)

stop();
horizontalMoving = false;
distance = 30;
speed = 15;
counter = 0;
speed_copy = speed;
mdirection = false;
autoEase = false;
_root.xpos = this._xmouse;
_root.ypos = this._ymouse;
if (horizontalMoving) {
if (!contentSize) {
contentSize = contentClip._width;
}
} else if (!contentSize) {
contentSize = contentClip._height;
}
left = mask._x;
right = mask._x+mask._width;
top = mask._y;
bottom = mask._y+mask._height;
function easeContent() {
xpos = this._xmouse;
ypos = this._ymouse;
k = 1;
if (xpos>left && xpos<right && ypos>top && ypos<bottom || autoEase) {
if (horizontalMoving) {
mousePercent = Math.abs(left-xpos)/Math.abs(left-right)-5.000000E-001;
} else {
mousePercent = Math.abs(top-ypos)/Math.abs(top-bottom)-5.000000E-001;
}
if (autoEase) {
if (mdirection) {
mousePercent = 2.000000E-001;
} else {
mousePercent = -2.000000E-001;
}
}
if (horizontalMoving) {
holder = contentClip._x;
if (holder>left-distance && holder<left) {
k = Math.abs(left-holder)/distance;
}
if (holder+contentSize<right+distance && holder+contentSize>right) {
k = Math.abs(right-(holder+contentSize))/distance;
}
} else {
holder = contentClip._y;
if (holder>top-distance && holder<top) {
k = Math.abs(top-holder)/distance;
}
if (holder+contentSize<bottom+distance && holder+contentSize>bottom) {
k = Math.abs(bottom-(holder+contentSize))/distance;
}
}
if (k>0 && k<1) {
if (k<1.000000E-001) {
k = 1.000000E-001;
}
speed_copy = k*speed;
}
if ((k || horizontalMoving || distance || !horizontalMoving || !k || !distance || !horizontalMoving)) {
holder = holder-Math.round(mousePercent*speed_copy);
}
if (horizontalMoving) {
if (holder<=left && holder+contentSize>=right) {
contentClip._x = Math.round(holder);
}
if (holder>left-distance/5 && !mdirection || holder+contentSize<right+distance/5 && mdirection) {
mdirection = !mdirection;
}
} else {
if (holder<=top && holder+contentSize>=bottom) {
contentClip._y = Math.round(holder);
}
if (holder>top-distance/5 && !mdirection || holder+contentSize<bottom+distance/5 && mdirection) {
mdirection = !mdirection;
}
}
}
}
autoEaseContent = function () {
if (_root.xpos == this._xmouse && _root.ypos == this._ymouse) {
if (counter == 120) {
autoEase = true;
} else {
autoEase = false;
++counter;
}
} else {
autoEase = false;
counter = 0;
_root.xpos = this._xmouse;
_root.ypos = this._ymouse;
}
};
contentClip.onEnterFrame = function() {
easeContent();
};

много, знаю... но может пытливый человек и здесь найдет ошибку...

etc
05.05.2007, 20:59
allowDomain тут не при делах.
Код мне ни о чем не говорит. Проверяй загрузку данных.

firsoff
05.05.2007, 21:15
экспериментировал - нужно было как то узнать о размере загружаемых файлов без полной загрузки, что то типа теста размеров... Юзал MovieClipLoader, по событию onLoadStart тупо убивал таргет мувик, выскакивала вышеупомянутая проблема, практически один в один, причем иногда работало(!), но только в IDE, если запустить отдельно swf скрипт не работал.
Тоже все перепровал, раз 20 переустанавливал, запускал на другой машине (сначала работало, потом опять глюк). Проблему решил след. образом, по onLoadProgress, убирал листенер, и тупо грузил в таргет мувик - пустышку swf.

etc
05.05.2007, 21:27
Ну начнем с того, что убийством клипа загрузку не остановишь, только накосячишь. Если нужно узнать размер файла, то для этого на сервере должен быть скрипт, это реализующий.

divinus
06.05.2007, 01:49
firsoff, да я согласен с __etc, загрузка идет отдельным потоком и ее убийством клипа - не остановишь... да и потом, мне же всетк надо загрузить полностью картинку, а не только размер ее узнать... поэтому фишка с swf-пустышкой мне не подходит... сам не могу понять в чем проблема... сейчас тестировал снова, ничего не исправлял, при стабильной скорости связи с интернетом 150- kb/sec - все работает хорошо как в IDE так и в интернете (опера)... при 10-15 flesh IDE выдает ошибку и вылетает, и через интернет - вообще загрузка не начинается... даже объекты не создаются...

etc
06.05.2007, 02:04
Это какой-то локальный глюк, я таких не видел никогда.

divinus
06.05.2007, 02:17
__etc? вот и я так думаю... плохо что не все отследить можно... по крайней мере variables и object листы - ничего не дают... все работает как положено... надо в MovieClipLoader'е покапаться... лень свой класс писать...

Chas
06.05.2007, 04:37
если в классах выполнить не дают, впоймать ошибку не получилось, и выходит такой "косяк", так может попробовать по старинке: getBytesLoaded(), getBytesTotal () ?
по крайней мере, вы сможете более точно локализовать проблему, убедившись, что она дейсвительно в MovieClipLoader.
зы. а какая версия плеера?

divinus
06.05.2007, 14:40
Chas, ошибка не в том что неверно определяется размер файла... (проверял), ошибка в том, что при низкой и не стабильной скорости интернета, MovieClipLoader' начинает глючить и касячить...

iNils
06.05.2007, 16:39
На время тестирования откажитесь от загрухки из инета, грузите локально.