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

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

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

Регистрация: Oct 2008
Сообщений: 14
По умолчанию Проблема с URLLoader!

Здравствуйте ув. форумчане!
Ситуация такая, существует класс подкюченный через Document root,
в конструкторе мне необходимо получить данные из PHP скрипта, делаю есессно через URLLoader, но он работает только через addEventListener а функция указываемая при создании слушаетеля работает только после завершения конструктора. Вопрос! Как же мне получить мои данные в конструктор?? В функции которую вызывает слушатель пытаюсь сохранять в поля класса, но это смысла не имеет т.е. она отрабатывает позже конструктора. Прилагаю исходник, прошу сильно не бить =) это вообще первое что я пишу на AS.
Код:
package hmain{
	import flash.display.Sprite;
	import flash.text.TextField;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.net.URLVariables;
	import flash.net.URLLoaderDataFormat;
	import flash.events.*;
	import flash.display.Bitmap;
	import flash.display.BitmapData;
	import flash.display.Loader;
	public class Header extends Sprite {
		public var h_image:String;
		public var h_title:String;
		public var h_description:String;
		private var img_width:Number=140;
		public function Header() {
			var max_id:Number=20;//Максимальный ИД, получаем из ФлашВарс(!НЕ ЗАБЫТЬ)
			var len:Number=15;//Сколько нужно вывести фильмов(!БАГ: лента не растягивается дальше чем указано в мувике)
			var i:Number=max_id-len;//Расчет начального значения счетчика для цикла
			var lent:lenta=new lenta();//Мувки ленты
			var iter:Number=0;//счетчик итераций цикла, для построения ленты
			while (i<=max_id) {//Каждая итерация цикла запрашивает данные о фильме по его ИД
				var reque:URLRequest=new URLRequest("http://localhost/FreshReportRu/web/datakeeper.php?id="+i);
				var loader:URLLoader=new URLLoader();
				loader.dataFormat=URLLoaderDataFormat.VARIABLES;
				loader.addEventListener(Event.COMPLETE, loadVars);//Добавляем слушателя, который скажет когда 
				//переменные загружены !ВОТ ТОТ САМЫЙ ЛИСТЕНЕР
				try {//Если что либо не так то выводим сообщение об ошибке
					loader.load(reque);
				} catch (error:Error) {
					trace("Не могу загрузить: "+error);
				}
				var img_loader:Loader=new Loader();//Лоадер для загрузки картинки
				img_loader.contentLoaderInfo.addEventListener(IOErrorEvent.IO_ERROR, loadImgErr);
				var img_request:URLRequest=new URLRequest("http://localhost/FreshReportRu/web/imagekeeper.php?id="+i);
				img_loader.load(img_request);//загрузка картинки
				var flm:film=new film(this.h_title, this.h_description, img_loader);//создаем мувик фильма и передаем ему картинку
				flm.x=this.img_width*iter;//рачсет координат мувика фильма
				lent.addChild(flm);
				iter++;
				img_loader=null;
				img_request=null;
				//Лоадер КОНЕЦ
				i++;
				reque=null;
				loader=null;
			}
			addChild(lent);//выводим ленту на экран
		}
		private function loadVars(ev:Event):void {//Реакция слушателя загрузки данных !ТА САМАЯ ФУНКЦИЯ
			var loader:URLLoader=URLLoader(ev.target);
			h_image=loader.data.h_image;
			h_title=loader.data.h_title;;
			h_description=loader.data.h_description;
		}
		private function loadImgErr(ev:IOErrorEvent):void {
			var txt:TextField=new TextField();
			txt.width=400;
			txt.text="Cannot load IMAGE!";
			addChild(txt);
		}
	}
}

Старый 29.10.2008, 23:42
Rzer вне форума Посмотреть профиль Отправить личное сообщение для Rzer Посетить домашнюю страницу Rzer Найти все сообщения от Rzer
  № 2  
Ответить с цитированием
Rzer
 
Аватар для Rzer

блогер
Регистрация: Feb 2007
Адрес: Spb
Сообщений: 612
Записей в блоге: 8
Отправить сообщение для Rzer с помощью ICQ
Передать их через html параметр flashVars (или GET методом - работает только в сети) и распарить их в конструкторе (stage.loaderInfo.parameters)
Но лучше выполнить блок кода инициализации после загрузки всех данных.

Рекомендую посмотреть http://code.google.com/p/bulk-loader/ - очень облегчает жизнь.

Код:
import br.com.stimuli.loading.BulkLoader;

var loader:BulkLoader = new BulkLoader("data-loader");
var numLoaded:int =0;

while (i<=max_id) {
   loader.add(reque,{id:i}); //можно просто строку вместо реквеста
   loader.get(i).addEventListener(Event.COMPLETE, completeFunc);
   i++;
}
loader.start();

private function completeFunc(e:Event):void{
   numLoaded++;
  if (numLoaded == len){
    //здесь код
    //Чтобы получить объект с информацией 
    var obj = loader.getSerializedData(id,convertStringToObject);
  }
}

private function convertStringToObject(val:String):Object{
  //здесь парсим строку любого формата в объект например "parameter1=val1&parameter2=val2";
  var obj:Object = {};
  var _array:Array = val.split("&");
  for(var i=0; i < _array.length; i++){
    obj[_array[i].split["="][0]]=_array[i].split["="][1];
  }
  return obj;
}
}
Код писал здесь, так что могли закрасться ошибки. Можно также пихать изображения и получать их через getBitmap(id).


Последний раз редактировалось Rzer; 30.10.2008 в 00:10.
Старый 30.10.2008, 15:22
mr.Ali вне форума Посмотреть профиль Отправить личное сообщение для mr.Ali Найти все сообщения от mr.Ali
  № 3  
Ответить с цитированием
mr.Ali
 
Аватар для mr.Ali

Регистрация: Oct 2008
Сообщений: 14
Спасибо за помощь =) но я не стал прибегать с сторонним лоадерам а слегка извратился и все получилось, работает по такой логике:
1.Грузит из скрипта данные причем циклично т.к. данные зависят от передаваемой переменной
2.после отработки конструктора вызывается функция слушателя лоадера причем делает это 15 раз, кол-во вызовов равно кол-ву итераций цикла в конструкторе.
Заполняет 3 массива данными. Когда видит что длинна массива стала равна переменной определяющей кол-во итераций цикла в конструкторе вызывает другую функцию(собственно в этом и заключается изврат на мой взгляд, был бы я разрабом флеша не стал бы делать столь дебильный загрузчик).
3.вызванная функиця уже грузит картинки опираясь на данные из массивов и строит изображение
Вот исходник:
Код:
package hmain{
	import flash.display.Sprite;
	import flash.text.TextField;
	import flash.net.URLLoader;
	import flash.net.URLRequest;
	import flash.net.URLVariables;
	import flash.net.URLLoaderDataFormat;
	import flash.events.*;
	import flash.display.Bitmap;
	import flash.display.Loader;
	public class Header extends Sprite {
		//переменные для построения циклов
		private var lent:lenta=new lenta();
		private var max_id:Number;
		private var start_id:Number;
		private var len:Number;
		//поля для данных о фильме
		private var film_title:Array=new Array();
		private var film_description:Array=new Array();
		private var film_image:Array=new Array();
		public function Header() {
			this.max_id=20;//Получаем из flashVars
			this.len=15;//Сколько надо вывести фильмов
			this.start_id=this.max_id-this.len;//с какого ИД начинать вывод
			for (this.start_id; this.start_id<=this.max_id; this.start_id++) {//поцикленно получаем данные о фильме
				var req:URLRequest=new URLRequest("http://localhost/FreshReportRu/web/datakeeper.php?id="+this.start_id);
				var ldr:URLLoader=new URLLoader();
				ldr.dataFormat=URLLoaderDataFormat.VARIABLES;
				ldr.addEventListener(Event.COMPLETE, getData);
				try {
					ldr.load(req);
				} catch (error:Error) {
					trace("Can`t load data! "+error);
				}
			}
		}
		private function getData(ev:Event) {
			var ldr:URLLoader=URLLoader(ev.target);
			this.film_title.push(ldr.data.h_title);
			this.film_description.push(ldr.data.h_description);
			this.film_image.push(ldr.data.h_image);
			//trace(this.film_title.length+" == "+(this.len+1)+" "+this.film_title);
			if ((this.film_title.length)==(this.len+1)) {
				createFilm();
			}
		}
		private function createFilm(){
			var start_id:Number;
			for(start_id=0; start_id<=this.len; start_id++){
				var img_request:URLRequest=new URLRequest("http://localhost/FreshReportRu/web/imagekeeper.php?image="+this.film_image[start_id]);
				var img_loader:Loader=new Loader();
				img_loader.load(img_request);
				var flm:film=new film(this.film_title[start_id], this.film_description[start_id], img_loader);
				flm.x=144*start_id;
				lent.addChild(flm);
				img_request=null;
				img_loader=null;
			}
			addChild(lent);
			
		}
	}
}

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

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

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


 


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


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