Форум 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)
-   -   Можно ли добавить к одному "слушателю" несколько "МувиКлипов" (http://www.flasher.ru/forum/showthread.php?t=131542)

acid_ninja 22.10.2009 20:26

Можно ли добавить к одному "слушателю" несколько "МувиКлипов"
 
Здравствуйте. Мне необходимо подгрузить из XML файла несколько изображений, причем процесс загрузки показать не для каждого изображения отдельно, а общим прелоадером. Добавил несколько "loadClip" для одного "addListener", но загрузка идет некорректно, когда первая картинка подгружается, счетчик исчезает и вторая грузиться уже без прелоадера. Подскажите, можно ли исправить код внеся небольшие коррективы, если да, то какие?
Код AS1/AS2:

var mcLoader:MovieClipLoader = new MovieClipLoader();
var listener:Object = new Object();
 
var container:XML = new XML();
container.ignoreWhite = true;
container.load("data.xml");
container.onLoad = function(success) {       
 
        listener.onLoadStart = function():Void {
        preloader_txt.text = "0%";
        }
 
        listener.onLoadError = function(clip:MovieClip, message:String):Void {
                if (message == "URLNotFound")
                {
                        preloader_txt.text = "Ссылка не найдена";
                }
                if (message == "LoadNeverCompleted")
                {
                        preloader_txt.text = "Ошибка загрузки";
                }
        }
 
        listener.onLoadProgress = function(target:MovieClip, bytesLoaded:Number, bytesTotal:Number):Void {
                X=Math.round(bytesLoaded/bytesTotal*100)+"%";
        }
 
        listener.onLoadComplete = function():Void {
                preloader_txt._visible = false;
        }
 
        mcLoader.addListener(listener);
        mcLoader.loadClip(container.firstChild.childNodes[0].attributes.link, mc_img02.mc_color);
        mcLoader.loadClip(container.firstChild.childNodes[1].attributes.link, mc_img01.mc_color);
 
}


mooncar 22.10.2009 21:11

"Слушатель" добавляется к экземпляру "MovieClipLoader", а не к слушателю "мувиклипы".
Без понимания работы MovieClipLoader продвигаться дальше будет бессмысленно.

Применительно к вашему случаю:
Один экземпляр MovieClipLoader.
Один набор обработчиков.
Один слушатель.
И несколько loadClip.
- Да, можно и нужно.

(Сделайте аналогично
http://www.flasher.ru/forum/showpost...12&postcount=5)

Попробуйте так:
Код AS1/AS2:

var mcLoader:MovieClipLoader = new MovieClipLoader();
var listener:Object = new Object();
 
listener.onLoadStart = function():Void {
preloader_txt.text = "0%";
};
 
listener.onLoadError = function(clip:MovieClip, message:String):Void {
        if (message == "URLNotFound")
        {
                preloader_txt.text = "Ссылка не найдена";
        }
        if (message == "LoadNeverCompleted")
        {
                preloader_txt.text = "Ошибка загрузки";
        }
};
 
listener.onLoadProgress = function(target:MovieClip, bytesLoaded:Number, bytesTotal:Number):Void {
        X=Math.round(bytesLoaded/bytesTotal*100)+"%";
};
 
listener.onLoadComplete = function():Void {
        preloader_txt._visible = false;
};
 
var container:XML = new XML();
container.ignoreWhite = true;
container.onLoad = function(success) {       
        mcLoader.addListener(listener);
        mcLoader.loadClip(container.firstChild.childNodes[0].attributes.link, mc_img02.mc_color);
        mcLoader.loadClip(container.firstChild.childNodes[1].attributes.link, mc_img01.mc_color);
};
container.load("data.xml");

Последовательность записи должна быть такая.

dimarik 23.10.2009 01:47

Код AS1/AS2:

var preloader_txt:        TextField;
 
var mcLoader:        MovieClipLoader = new MovieClipLoader();
this.mcLoader.addListener(this);
 
var _loaders:        Object = new Object();
 
var _queue:                Array = new Array();
 
// also we have the map table [link] --> [mc]
var map:Object = {
        link_1 : "mc_img01.mc_color",
        link_2 : "mc_img02.mc_color",
        link_3 : "mc_img03.mc_color",
};
 
 
var container:XML = new XML();
this.container.ignoreWhite = true;
this.container.onLoad = function(success:Boolean):Void {
 
        if (!success) {
                trace("Ooops!");
                return;
        }
 
        var doc:        XMLNode= this.firstChild;
        var node:        XMLNode;
        var ea:                Object; /* node attributes*/
 
        while (node = doc.firstChild) {
                ea = node.attributes;
                addToQueue(ea['link'], map[ea['link']]);
                // remove useless node
                node.removeNode();       
        }
 
        startLoad();
 
};
 
this.container.load("data.xml");
 
 
//---------------------------------------------------------
//
//    Events handlers: MovieClipLoader
//
//---------------------------------------------------------
 
 
function startLoad():Void {
        var maxConn:        Number = this.getMaximumConnections();
        var queue:                Array = this._queue.splice(0, maxConn);
 
        var assets:                Array;
 
        while (queue.length) {
                assets = queue.shift();
                this.mcLoader.loadClip(assets[0]/* url */, assets[1]/* target */);
        }
 
}
 
function updateProgress():Void {
        // Init overall progress counters
        var queueBytesLoaded:        Number = 0;
        var queueBytesTotal:        Number = 0;
 
        var loaderInfo:                        Object;
 
        for (var i:String in this._loaders) {
                // read next loaderInfo object;
                loaderInfo = this._loaders[i];
 
                queueBytesLoaded += loaderInfo.bytesLoaded;
                queueBytesTotal += loaderInfo.bytesTotal;
        }
 
        // Update indicator
        // Better way is to dispatch Event.PROGRESS_EVENT event instead
        this.preloader_txt.text = Math.round(queueBytesLoaded / queueBytesTotal * 100)+"%";
}
 
//---------------------------------------------------------
//
//    Events handlers: MovieClipLoader
//
//---------------------------------------------------------
 
function onLoadStart(target:MovieClip):Void {
 
        // Reset indicator if new queue of downloads begin
        if (this._loaders.length == 0) {
                this.preloader_txt._visible = true;
                this.preloader_txt.text = "0%";
        }
 
        var loaderID:String = this.generateUID();
 
        // Ensure what we have only unique ID
        while (this._loaders[loaderID]) {
                loaderID = this.generateID();
        }
 
        // Init loaderInfo for the target
        var loaderInfo:Object = new Object();
        loaderInfo.target = target;
        loaderInfo.bytesLoaded = 0;
        loaderInfo.bytesTotal = 0;
 
        this._loaders[loaderID] = loaderInfo;
}
 
function onLoadProgress(target:MovieClip, bytesLoaded:Number, bytesTotal:Number):Void {
        var loaderInfo:                        Object;
 
        for (var i:String in this._loaders) {
                // read next loaderInfo object;
                loaderInfo = this._loaders[i];
 
                // we found appropriate loader info
                // update profress info for it
                if (loaderInfo.target == target) {
                        loaderInfo.bytesLoaded = bytesLoaded;
                        loaderInfo.bytesTotal = bytesTotal;
                        // No needs to continue
                        break;
                }
        }
 
        // Well, go update overall progress
        this.updateProgress();
}
 
 
function onLoadError(target:MovieClip, message:String):Void {
        var loaderInfo:                        Object;
 
        for (var i:String in this._loaders) {
                loaderInfo = this._loaders[i];
 
                if (loaderInfo.target == target) {
                        // remove useless loaderInfo
                        delete this._loaders[i];
                        // Update overall progress
                        this.updateProgress();
                        break;
                }
        }
 
        if (message == "URLNotFound")
        {
                preloader_txt.text = "Ссылка не найдена";
        }
        if (message == "LoadNeverCompleted")
        {
                preloader_txt.text = "Ошибка загрузки";
        }
}
 
function onLoadComplete(target_mc:MovieClip):Void {
        var loaderInfo:                        Object;
 
        for (var i:String in this._loaders) {
                loaderInfo = this._loaders[i];
 
                if (loaderInfo.target == target) {
                        // remove completed loaderInfo
                        delete this._loaders[i];
                        this.updateProgress();
                        break;
                }
        }
 
        // load pending item
        if (this._queue.length) {
                var asset:Array = this._queue.shift();
                this.mcLoader.loadClip(asset[0]/* url */, asset[1] /* target */);
        }
        else {
                // job done! say cya to indicator
                // But dispatch Event.COMPLETE event is better!
                this.preloader_txt._visible = false;
        }
}
 
//---------------------------------------------------------
//
//    Helper functions
//
//---------------------------------------------------------
 
 
// determines number of maximum simultaneous loadings
function getMaximumConnections():Number {
        // For simplify we decide the max connections depends of:
        return _root._url.indexOf("file://") == 0 ? 10 : 3;
}
 
// add to loading queue
function addToQueue(url:String, target:MovieClip):Void {
        if (!url || typeof target != 'movieclip') return;
        this._queue.push( [url, target] );
}
 
// generate unique ID
function generateID():String {
        return String( Math.floor(Math.random() * 1e6) );
}


acid_ninja 23.10.2009 14:42

Цитата:

Попробуйте так:
Попробовал, прелоадер теперь не сбивается и доходит до 100%, но все равно загружается только одно изображение, остальные продолжают грузиться уже после завершения работы прелоадера.

dimarik
К сожалению заставить работать код не вышло, исправил пару строк, которые выдавали ошибки, но безрезультатно.

Неужели нужно прикручивать к флешке такой большой сценарий, только что бы заработал прелоадер? Если честно, я не гонюсь за гибкостью в работе сценария и не хочу предусматривать все возможные ситуации его работы.

acid_ninja 30.10.2009 14:06

Вложений: 1
Залил архив со всеми файлами, на 27% работа предоадера обрывается, помогите пожалуйста :o

dimarik 30.10.2009 14:31

Ваше текстовое поле становится невидимым после загрузки первой картинки:

Код AS1/AS2:

listener.onLoadComplete = function():Void {
        preloader_txt._visible = false;
};


Если Вы подумали, что прогресс загрузки здесь общий, то спешу Вас разочаровать:

Код AS1/AS2:

listener.onLoadProgress = function(target:MovieClip, bytesLoaded:Number, bytesTotal:Number):Void {
        trace(target + ' => ' +getTimer());
        preloader_txt.text=Math.round(bytesLoaded/bytesTotal*100)+"%";
};


acid_ninja 30.10.2009 16:59

Цитата:

Ваше текстовое поле становится невидимым после загрузки первой картинки
Спасибо, так и есть, упустил этот нюанс.

Цитата:

Если Вы подумали, что прогресс загрузки здесь общий, то спешу Вас разочаровать
а как сделать общим, не подскажите (относительно моего кода)?

dimarik 30.10.2009 17:08

я же Вам привел код в посте #3. Допилите его, он на коленке написан был и будет Вам щастье =)

amexdesign 31.10.2009 04:37

Вложений: 1
Цитата:

а как сделать общим, не подскажите (относительно моего кода)?
можно вот так:

acid_ninja 31.10.2009 15:15

Цитата:

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


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

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