Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Сообщения за день
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 1.0/2.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 22.10.2009, 20:26
acid_ninja вне форума Посмотреть профиль Отправить личное сообщение для acid_ninja Найти все сообщения от acid_ninja
  № 1  
Ответить с цитированием
acid_ninja

Регистрация: Oct 2009
Сообщений: 5
По умолчанию Можно ли добавить к одному "слушателю" несколько "МувиКлипов"

Здравствуйте. Мне необходимо подгрузить из 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);
 
}

Старый 22.10.2009, 21:11
mooncar вне форума Посмотреть профиль Отправить личное сообщение для mooncar Найти все сообщения от mooncar
  № 2  
Ответить с цитированием
mooncar
Модрон-ветеринар
 
Аватар для mooncar

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
"Слушатель" добавляется к экземпляру "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");
Последовательность записи должна быть такая.


Последний раз редактировалось mooncar; 22.10.2009 в 21:25.
Старый 23.10.2009, 01:47
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 3  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Код 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) );
}
__________________
Воспитан в TimeZero. Работаю в Mail.ru.


Последний раз редактировалось dimarik; 23.10.2009 в 02:12.
Старый 23.10.2009, 14:42
acid_ninja вне форума Посмотреть профиль Отправить личное сообщение для acid_ninja Найти все сообщения от acid_ninja
  № 4  
Ответить с цитированием
acid_ninja

Регистрация: Oct 2009
Сообщений: 5
Цитата:
Попробуйте так:
Попробовал, прелоадер теперь не сбивается и доходит до 100%, но все равно загружается только одно изображение, остальные продолжают грузиться уже после завершения работы прелоадера.

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

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

Старый 30.10.2009, 14:06
acid_ninja вне форума Посмотреть профиль Отправить личное сообщение для acid_ninja Найти все сообщения от acid_ninja
  № 5  
Ответить с цитированием
acid_ninja

Регистрация: Oct 2009
Сообщений: 5
Залил архив со всеми файлами, на 27% работа предоадера обрывается, помогите пожалуйста
Вложения
Тип файла: zip preloader-edit.zip (54.0 Кб, 28 просмотров)

Старый 30.10.2009, 14:31
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 6  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
Ваше текстовое поле становится невидимым после загрузки первой картинки:

Код 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)+"%";
};
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 30.10.2009, 16:59
acid_ninja вне форума Посмотреть профиль Отправить личное сообщение для acid_ninja Найти все сообщения от acid_ninja
  № 7  
Ответить с цитированием
acid_ninja

Регистрация: Oct 2009
Сообщений: 5
Цитата:
Ваше текстовое поле становится невидимым после загрузки первой картинки
Спасибо, так и есть, упустил этот нюанс.

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

Старый 30.10.2009, 17:08
dimarik вне форума Посмотреть профиль Отправить личное сообщение для dimarik Найти все сообщения от dimarik
  № 8  
Ответить с цитированием
dimarik
.
 
Аватар для dimarik

модератор форума
Регистрация: Sep 2003
Адрес: Москва
Сообщений: 4,630
Записей в блоге: 20
я же Вам привел код в посте #3. Допилите его, он на коленке написан был и будет Вам щастье =)
__________________
Воспитан в TimeZero. Работаю в Mail.ru.

Старый 31.10.2009, 04:37
amexdesign вне форума Посмотреть профиль Отправить личное сообщение для amexdesign Посетить домашнюю страницу amexdesign Найти все сообщения от amexdesign
  № 9  
Ответить с цитированием
amexdesign

Регистрация: Jan 2009
Адрес: Германия, Bochum
Сообщений: 169
Отправить сообщение для amexdesign с помощью Skype™
Цитата:
а как сделать общим, не подскажите (относительно моего кода)?
можно вот так:
Вложения
Тип файла: zip preloader-edit.zip (62.1 Кб, 37 просмотров)

Старый 31.10.2009, 15:15
acid_ninja вне форума Посмотреть профиль Отправить личное сообщение для acid_ninja Найти все сообщения от acid_ninja
  № 10  
Ответить с цитированием
acid_ninja

Регистрация: Oct 2009
Сообщений: 5
Цитата:
можно вот так:
так он сбивается после загрузки каждого изображения и начинает считать по новой

Создать новую тему Ответ Часовой пояс GMT +4, время: 06:51.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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