Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   непонятный глюк с MovieClipLoader() (http://www.flasher.ru/forum/showthread.php?t=95429)

divinus 05.05.2007 19:46

непонятный глюк с MovieClipLoader()
 
Здравствуйте.
Суть проблемы в следующем...
Есть галерея, которая динамически исходя из 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

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


Часовой пояс GMT +4, время: 19:40.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.