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

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

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

блогер
Регистрация: Feb 2011
Адрес: Россия, Тольятти
Сообщений: 301
Записей в блоге: 10
По умолчанию Возможно ли считывать несколько файлов?

В процессе создания чата возникла проблема обновления онлайн-списка юзеров в чате. Разработал такой алгоритм:
1) Получаю количество ВСЕХ пользователей
2) Циклически открываю файлы с их статусом (off или on): если on - добавляю ID онлайн-юзера в массив онлайн-юзеров
4) Прогоняю массив в цикле, чтобы открывать данные по ID юзера: считываю файлы юзера с данным ID (логин, к примеру)
5) генерирую список мувиков с данным из массива

Если нужны коды - я пришлю, но дело в том, что если вставить в функцию такой вот цикл:
Код AS1/AS2:
for (i=1; i<=users; i++){
		var lv:LoadVars = new LoadVars();
		lv.onLoad = lvOnLoad;
		_urls = _root.gameInfo.server + "USERS/"+ i + ".stat";
		lv.load(_urls);
		function lvOnLoad (suc:Boolean) {
			if(suc){
				trace ("2,5 да");
				statUser = this.statUser;
				if (statUser == "Онлайн"){
					trace ("3 Добавлен "+i);
					usersArray.push(i);
				}
			}
		}
	}
то чтения файлов не произойдет и значение usersArray.length окажется равным нулю. Как по другому можно прописать циклическое считывание файлов?
__________________
Надо сменить подпись...

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

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
А почему бы не обойтись одним источником данных, например, XML?
А то ведь сколько юзеров, столько и http-запросов - неправильно это.
__________________
Идите первым!


Последний раз редактировалось mooncar; 23.03.2012 в 13:13.
Старый 23.03.2012, 13:09
lexa2000lexa вне форума Посмотреть профиль Отправить личное сообщение для lexa2000lexa Найти все сообщения от lexa2000lexa
  № 3  
Ответить с цитированием
lexa2000lexa

Регистрация: Sep 2005
Сообщений: 950
Нужно дожидаться загрузки одного файла, а потом загружать другой и так пока не загрузяться все файлы, чтото типа того
Код AS1/AS2:
var i:Number = 1
var lv:LoadVars = new LoadVars();
lv.onLoad = lvOnLoad;
_urls = _root.gameInfo.server + "USERS/"+ i + ".stat";
function lvOnLoad (suc:Boolean) {
			if(suc){
				i++
				trace ("2,5 да");
				statUser = this.statUser;
				if (statUser == "Онлайн"){
					trace ("3 Добавлен "+i);
					usersArray.push(i);
				}
			}
			_urls = _root.gameInfo.server + "USERS/"+ i + ".stat";
			lv.load(_urls);
 
		}

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

администратор
Регистрация: May 2009
Адрес: г.Казань
Сообщений: 7,357
Отправить сообщение для mooncar с помощью ICQ Отправить сообщение для mooncar с помощью Skype™
lexa2000lexa, конвеер - это хорошо, но об "он-лайне" тогда говорить будет тяжело, процесс обновления растянется во времени.
__________________
Идите первым!

Старый 23.03.2012, 13:18
lexa2000lexa вне форума Посмотреть профиль Отправить личное сообщение для lexa2000lexa Найти все сообщения от lexa2000lexa
  № 5  
Ответить с цитированием
lexa2000lexa

Регистрация: Sep 2005
Сообщений: 950
Полностью с вами согласен, но как сделает автор, только ему известно, а я предложил решение которое подойдет при нынешней постановке задачи.

Старый 23.03.2012, 15:53
EndoCrinologist вне форума Посмотреть профиль Отправить личное сообщение для EndoCrinologist Найти все сообщения от EndoCrinologist
  № 6  
Ответить с цитированием
EndoCrinologist
 
Аватар для EndoCrinologist

блогер
Регистрация: Feb 2011
Адрес: Россия, Тольятти
Сообщений: 301
Записей в блоге: 10
И за это огромное Вам спасибо.
Я начинал работать с xml, но у меня что-то не заладилось. Поэтому пока попробую своим нубовским методом.

Добавлено через 5 часов 3 минуты
Воспользовавшись Вашим примером, я создал функцию, которая обновляется каждую секунду. Эта функция открывает оба файла с данными, считывает их и генерирует в окне юзеров чата список пользователей. Вот сама функция:
Код AS1/AS2:
function creatBoxList(){
	trace("1=== СОЗДАНИЕ НОВОГО БОКСА");
	// СЧИТЫВАЮ ЛОГИНЫ
	i = 1;
	n = i-1;
	id = _root.yaonline.usersOnlineArray[n];
	trace("2=== ID = "+id);
 
	var lvLOG:LoadVars = new LoadVars();
	lvLOG.onLoad = lvLOGOnLoad;
	_urls = _root.gameInfo.server + "USERS/"+ id + ".usr";
	lvLOG.load(_urls);
	function lvLOGOnLoad (sucLOG:Boolean) {
		if(sucLOG){
			logU = this.log;			
			trace("3=== Получил ЛОГ = "+logU);
		}
 	}	
 
	// ПОЛУЧЕНИК ДАННЫХ
	var lvDATA:LoadVars = new LoadVars();
	lvDATA.onLoad = lvDATAOnLoad;
	_urls = _root.gameInfo.server + "USERS/"+ id + ".data";
	lvDATA.load(_urls);
	function lvDATAOnLoad (sucDATA:Boolean) {
	trace("4=== Переход");
		if(sucDATA){
			trace("5=== Получил ДАТА");
			expirU = this.expir;
			war_winU = this.war_win;
			hit_allU = this.hit_all;
			hit_okU = this.hit_ok;
			levelU = Math.round(expirU/100);
			if (hit_allU != 0){
				coolHitU = Math.round(hit_okU/hit_allU) + "%";
			} else {
				coolHitU = "Нет";
			}
 
			ycoord = id * 60 - 60;
			attachMovie("ussr", "ussr"+id, this.getNextHighestDepth(), {_x:0, _y:ycoord});
			trace("6=== НОВЫЙ ОБЪЕКТ: "+eval("ussr"+id));
			eval("ussr"+id).log.text = logU;
			eval("ussr"+id).expir.text = "Опыт: "+expirU;
			eval("ussr"+id).war_win.text = "Победы: "+war_winU;
			eval("ussr"+id).level.text = "Уровень: "+levelU;
			eval("ussr"+id).coolHit.text = "Точность: "+coolHitU;
		}
	}
	if (i < _root.yaonline.users_on){
		i++;
		n = i-1;
		id = _root.yaonline.usersOnlineArray[n];
		_urls = _root.gameInfo.server + "USERS/"+ id + ".usr";
		lvLOG.load(_urls);
	}	
}
Да, она довольно большая и трудная, но она работает. Но не совсем корректно. Дело в том, что пока в чате пользователь №1, то блок данных ussr вставляется нормально и в списке видно пользователя №1 в самом верху с его данными, но как только появляется №2, то №1 исчезает, вместо него остается пустое место, а №2 встает на второе место.

А во втором случае, если уже сидит №2, то он также отображается сразу сверху. И как только №1 появляется в онлайне, то №2 делает отступ вниз в списке, а №1 не появляется

Я так понимаю, причина в том, что ЯКОБЫ цикл не выполняется и считываются данные только для последнего по списку пользователя. А вот где я допустил ошибку, я не понимаю. Можете помочь разобраться?
__________________
Надо сменить подпись...


Последний раз редактировалось EndoCrinologist; 23.03.2012 в 21:11.
Создать новую тему Ответ Часовой пояс GMT +4, время: 17:30.
Быстрый переход
  « Предыдущая тема | Следующая тема »  

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

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


 


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


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