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

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

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Закрытая тема
Старый 21.03.2014, 17:36
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 1  
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
По умолчанию Связь между фабрикой и загрузчиком

Читаю интернет и книжки два дня, но не могу самостоятельно придти к однозначному выбору, по этому прошу объяснить, как наладить связь между загрузчиком и фабрикой. У самого в голове полтора неполных варианта -
1) по запросу с сервера приходит xml-json файл с ссылками, который попав в загрузчик разбирается на объекты и отправляется в массив очереди. По мере загрузки все ассеты попадают в какое-то хранилище, а по окончанию, хранилище передается в фабрику, где.. Где эти ассеты нужно привести к пригодному типу.
И вот с этого момента возникает понимание, что без ЧЕГО-ТО не получится правильно разместить ассеты.

И вариант 1.5, это когда файл полученный с сервера разбирается на объекты и передается не в загрузчик, а
в ДО объекты, которые при ините будут что-то делать.. Но с таким вариантом, ещё больше вопросов..

В общем, объясните на словах ( только подробнее ), как это должно быть?

Старый 21.03.2014, 20:10
Wolsh вне форума Посмотреть профиль Отправить личное сообщение для Wolsh Найти все сообщения от Wolsh
  № 2  
Wolsh
Нуб нубам
 
Аватар для Wolsh

модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
Ну так XML должен содержать не просто Кучу ссылок, у каждой ссылки есть идентификатор, указывающий, что это такое будет.
Нетупой загрузчик должен сложить ассеты не просто в Кучу, а в объект с доступами по идентификатору.
Фабрика должна знать идентификаторы того, что ей нужно для создания объектов.
Тогда ошибка возможна только если вместо ассета "автомат Калашникова" в XML окажется ссылка на ассет "Кукла Маша". Уровни абстракции то не бесконечны. Не надо думать, что программа может должна уметь принять что угодно и как-то сделать из этого конфетку. Не что угодно. Автомат значит автомат. Программа должна получить автомат. А уж как его нарисует дизайнер в текущей версии — это и есть свобода.
__________________
Reality.getBounds(this);

Старый 21.03.2014, 22:52
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 3  
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Хорошо бы посмотреть ваш код загрузчика с фабрикой, что вы пытаетесь связать. Конкретизировать проблему, так сказать. Или опять будем обсуждать сферического коня в вакууме?

Старый 21.03.2014, 23:17
kotyavo вне форума Посмотреть профиль Отправить личное сообщение для kotyavo Найти все сообщения от kotyavo
  № 4  
kotyavo

Регистрация: Dec 2013
Сообщений: 49
Я делал так, вроде хорошо работает

Код AS3:
 
package
{
	import flash.display.MovieClip;
	import flash.events.Event;
 
 
public class AssetManager extends MovieClip
	{
		var assets_url:Array;
		var assets:Array;
		var loading:Number;
 
		public function AssetManager()
		{
			assets = new Array;
			assets_url = new Array;
			loading = 0;
		}
 
		/**
		 * 
		 * @param	url
		 */
		public function add(url:String, name:String):void
		{
			loading++;
			assets_url[name] = url;
		}
 
		/**
		 * Получить загруженный asset
		 * @param	name
		 * @return
		 */
		public function get(name:String)
		{
			var asset:AssetLoad = AssetLoad(assets[name]);
			return asset.clone();
		}
 
		/**
		 * 
		 * @param	e
		 */
		public function decrimentLoader(e:Event):void
		{
			loading--;
			if (loading <= 0)
			{
				dispatchEvent(new Event(Event.COMPLETE));
			}
		}
 
		/**
		 * Запустить загрузку всех ресурсов
		 */
		public function loadAssets():void 
		{
			for (var name:String in assets_url)
			{
 
				var asset:AssetLoad =  new AssetLoad(assets_url[name], name);
				asset.addEventListener(Event.COMPLETE, decrimentLoader);
				assets[name] = asset;
 
			}
 
		}
}
Код AS3:
package
{
	import flash.display.*;
 
	import flash.events.Event;
	import flash.net.URLRequest;
 
	/**
	 * ...
	 * @author 
	 */
	public class AssetLoad extends MovieClip 
	{
		public var loader:Loader;
 
		public var bitmapData:BitmapData;
 
		public function AssetLoad(file:String, name:String = null):void
		{
			loader = new Loader;
			loader.name = name;
			loader.load(new URLRequest(file));
			loader.contentLoaderInfo.addEventListener(Event.COMPLETE, this.onLoaderComplite);
		}
 
 
		/**
		 * Дубликат
		 */
		public function clone() {
			var mc:MovieClip = new MovieClip();
				mc.addChild( new Bitmap(bitmapData));
			return mc;
		}	
 
 
		public function onLoaderComplite(event:Event):void 
		{ 
			var loader:Loader = event.target.loader as Loader;
				bitmapData = Bitmap(loader.content).bitmapData.clone();
				//loader.cacheAsBitmap = true;
 
				addChildAt(clone(), 0);
 
			//loader = null;
			loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, this.onLoaderComplite);
			dispatchEvent( new Event(Event.COMPLETE));
 
		}
	}
 
}

Старый 22.03.2014, 00:44
Babylon вне форума Посмотреть профиль Отправить личное сообщение для Babylon Посетить домашнюю страницу Babylon Найти все сообщения от Babylon
  № 5  
Babylon
[+1 25.10.13]
[+4 18.03.14]
 
Аватар для Babylon

Регистрация: Jan 2006
Адрес: Москва, Зеленоград
Сообщений: 653
Отправить сообщение для Babylon с помощью ICQ
Akopalipsis, дисплей объекту, состоящему из ассетов лучше поставить в соответствие XML объект и дальше делать запросы, фильтры. На выходе у тебя будет XMLList, ids нод, которых связаны с дисплей объектом например так mc[node.@id]. По-моему эта тема уже пошла по десятому кругу.

Старый 22.03.2014, 02:52
in4core вне форума Посмотреть профиль Отправить личное сообщение для in4core Найти все сообщения от in4core
  № 6  
in4core
[+4 06.05.14]
 
Аватар для in4core

Регистрация: Mar 2009
Сообщений: 4,219
Записей в блоге: 14
действительно здолбало... Зачем спрашивать универсальное решение, если его все равно нет? Как нравится так и пиши - ТС - помоему ты уже все темы исчерпал какие только можно. Теперь ты все знаешь и понимаешь, а дальше дело практики.
__________________
Марк Tween

Старый 22.03.2014, 21:36
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 7  
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Wolsh Немного лести Вот пока не прочел Ваше сообщение, почему-то мысли в кучу не собирались, Спасибо!

Получилось пока вот как, надо только подумать ещё о "кучном наполнении", так-как не могу придумать, как обработать текстурный атлас, он же не один, а с xml впаре должен быть..

Код AS3:
var setHandlers:Dictionary = new Dictionary();
var getHandlers:Dictionary = new Dictionary();
setHandlers[Factory.SET_AS_BITMAPDATA] = handler;
getHandlers[Factory.GET_AS_SPRITE] = getHandler;
var factory:Factory = Factory.createFactory('factory',setHandlers,getHandlers);
factory.setValueAs(new Shape(), 'img', Factory.SET_AS_BITMAPDATA);
factory.getValueAs('img', Factory.GET_AS_SPRITE, true);

Код AS3:
package a_factory_package 
{
	import flash.display.BitmapData;
	import flash.utils.Dictionary;
 
	public class Factory 
	{
		public static const SET_AS_BITMAPDATA:String = "setAsBitmapData";
		protected static const SET_AS_COMMANDS:Vector.<String> = new <String>[SET_AS_BITMAPDATA];
 
		public static const GET_AS_SPRITE:String = "getAsSprite";
		public static const GET_AS_DEFAULT_VALUE:String = "getAsDefaultValue";
		protected static const GET_AS_COMMANDS:Vector.<String> = new <String>[GET_AS_DEFAULT_VALUE];
 
		protected static var _handlersGetValueDefault:Dictionary;
		protected static function get handlersGetValueDefault():Dictionary
		{
			if (_handlersGetValueDefault == null)
				_handlersGetValueDefault = new Dictionary();
 
			return _handlersGetValueDefault;
		}
 
		protected static var _handlersSetValueDefault:Dictionary;
		protected static function get handlersSetValueDefault():Dictionary
		{
			if (_handlersSetValueDefault == null)
					_handlersSetValueDefault = new Dictionary();
 
			return _handlersSetValueDefault;
		}
 
		protected static var allFactorys:Dictionary = new Dictionary();
 
		protected var handlersSetValue:Dictionary;
		protected var handlersGetValue:Dictionary;
 
		protected var assetsStorage:Dictionary = new Dictionary();
		internal function getAssetsStorage():Dictionary { return this.assetsStorage; }
		internal function setAssetsStorage(value:Dictionary):void { this.assetsStorage = value; }
 
		protected var name:String;
 
		public function Factory(name:String, handlersSetValue:Dictionary = null, handlersGetValue:Dictionary = null)
		{
			if (handlersSetValue == null)
					this.handlersSetValue = handlersSetValueDefault;
			else 
					this.handlersSetValue = handlersSetValue;
 
			if (handlersGetValue == null)
					this.handlersGetValue = _handlersGetValueDefault;
			else 
					this.handlersGetValue = handlersGetValue;
 
			this.name = name;
		}
 
		public static function getFactory(name:String):Factory
		{
			var isFactoryNameValid:Boolean = name in Factory.allFactorys;
			if ( ! isFactoryNameValid)
					throw new ArgumentError("[Factory] ОШИБКА!!! метод getFactory - фабрики с указаным именем не существует.");
 
			return Factory.allFactorys[name];
		}
 
		public static function setFactory(factory:Factory):void
		{
			var factoryName:String = factory.toString();
			var isFactoryNameAlready:Boolean = factoryName in Factory.allFactorys;
			if (isFactoryNameAlready)
					throw new ArgumentError("[Factory] ОШИБКА!!! метод setFactory - фабрика с указанным именем уже существует.");
 
			Factory.allFactorys[factoryName] = factory;
		}
 
		public function getValueAs(name:Object, commandGetValue:String = Factory.GET_AS_DEFAULT_VALUE, isGetValueAsNewObject:Boolean = false):Object
		{
			if (name == null)
					throw new ArgumentError("");
 
			var isCommandDefaultValue:Boolean = commandGetValue == Factory.GET_AS_DEFAULT_VALUE;
			var isComandsValid:Boolean = commandGetValue in this.handlersGetValue;
			if ( ! isCommandDefaultValue && ! isComandsValid)
			{
				var errorMessage:String = "[Factory].name == " + this.toString() + " ОШИБКА!!! метод getValueAs - недопустимое значение свойства commandGetValue.";
				throw new ArgumentError(errorMessage);
			}
 
			var asset:Object = this.assetsStorage[name];
			if (asset == null)
			{
				errorMessage = "[Factory].name == " + this.toString() + " ОШИБКА!!! метод getValueAs - ассета с указанным именем не существует";
				throw new Error(errorMessage);
			}
 
			if (isGetValueAsNewObject)
			{
				var sourceClass:Object = Object(asset).constructor;
				asset = new sourceClass();
			}
 
			if (isCommandDefaultValue)
			{
				return this.assetsStorage[name];
			}
 
			var handler:Function = this.handlersGetValue[commandGetValue];
			if (handler == null)
			{
				errorMessage = "[Factory].name == " + this.toString() + " ОШИБКА!!! метод getValueAs - свойство this.handlersGetValue[name] == null";
				throw new Error(errorMessage);
			}
			return handler(asset);
		}
 
		public function setValueAs(asset:Object, name:String, commandSetValue:String = Factory.GET_AS_DEFAULT_VALUE):void
		{
			var isCommandDefaultValue:Boolean = commandSetValue == Factory.GET_AS_DEFAULT_VALUE;
			var isComandsNotValid:Boolean = commandSetValue in this.handlersSetValue;
			if ( ! isCommandDefaultValue && ! isComandsNotValid)
			{
				var errorMessage:String = "[Factory].name == " + this.toString() + " ОШИБКА!!! метод setValueAs - недопустимое значение свойства commandSetValue.";
				throw new ArgumentError(errorMessage);
			}
 
			if (name == null)
					throw new ArgumentError("");
 
			var isAssetNameAlready:Boolean = name in this.assetsStorage;
			if (isAssetNameAlready)
			{
				errorMessage = "[Factory].name == " + this.toString() + " ОШИБКА!!! метод setValueAs - такое имя уже существует.";
				throw new Error(errorMessage);
			}
 
			if (isCommandDefaultValue)
			{
				this.assetsStorage[name] = asset;
				return;
			}
 
			var handler:Function = this.handlersSetValue[commandSetValue];
			if (handler == null)
					throw new ArgumentError("");
 
			this.assetsStorage[name] = handler(asset);
		}
 
		public function removeAsset(name:Object):void
		{
			var isAssetNameValid:Boolean = name in this.assetsStorage;
			if ( ! isAssetNameValid)
					throw new ArgumentError("");
 
			var asset:Object = this.assetsStorage[name];
			if (asset is BitmapData)
					(asset as BitmapData).dispose();
 
			asset = null;
			delete this.assetsStorage[name];
		}
		public function removeAllAssets():void
		{
			var asset:Object, name:Object;
			for (name in this.assetsStorage)
			{
				asset = this.assetsStorage[name];
				if (asset is BitmapData)
					(asset as BitmapData).dispose();
 
				asset = null;
				delete this.assetsStorage[name];
			}
		}
		public function destroy():void
		{
			var name:Object;
 
			this.removeAllAssets();
 
			this.assetsStorage = null;
 
			for (name in this.handlersGetValue)
					delete this.handlersGetValue[name];
 
			for (name in this.handlersSetValue)
					delete this.handlersSetValue[name];
		}
 
		public static function createFactory(name:String, handlersSetValue:Dictionary = null, handlersGetValue:Dictionary = null):Factory
		{
			var isNameNotValid:Boolean = name in Factory.allFactorys;
			if (isNameNotValid)
			{
				var errorMessage:String = "[Factory] ОШИБКА!!! попытка присвоить экземпляру класса существующее имя.";
				throw new ArgumentError(errorMessage);
			}
			return Factory.allFactorys[name] = new Factory(name, handlersSetValue, handlersGetValue);
		}
 
		public static function setAssetsAs(factory:Object, asset:Object, command:Object):Object
		{
			var concreteFactory:Factory = Factory.allFactorys[factory];
			if (concreteFactory == null)
			{
				var errorMessage:String = "[Factory] ОШИБКА!!! метод setAssetsAs - фабрики " + factory + " не существует.";
				throw new ArgumentError(errorMessage);
			}
 
			if (asset == null)
					throw new ArgumentError("");
 
			if (command == null)
					throw new ArgumentError("");
 
			return null
		}
		public function toString():String
		{
			return this.name;
		}
	}
 
}


Последний раз редактировалось Akopalipsis; 22.03.2014 в 22:01.
Старый 22.03.2014, 23:10
alexcon314 вне форума Посмотреть профиль Отправить личное сообщение для alexcon314 Найти все сообщения от alexcon314
  № 8  
alexcon314
listener

модератор форума
Регистрация: Jun 2006
Сообщений: 3,260
Записей в блоге: 28
Отправить сообщение для alexcon314 с помощью ICQ
Akopalipsis, я не просил вас развешивать лапшу. Я просил вас конкретизировать проблему: что у вас не получается? В контексте вопроса "Связь между фабрикой и загрузчиком". Пока я этого не вижу. Или вы соберетесь и сформулируете конкретную проблему, или тема будет закрыта.
Это означает - самостоятельно решите вашу проблему, доведя код хоть до какого-то но работоспособного сосотяния, а потом спрашивайте. Писать вместе с вами ваш проект, вникать в ваши замыслы никто не собирается.

Старый 22.03.2014, 23:36
Akopalipsis вне форума Посмотреть профиль Найти все сообщения от Akopalipsis
  № 9  
Akopalipsis
Banned
[+4 24.02.14]
[+4 07.11.13]
[+ 13.03.14]

Регистрация: Mar 2013
Сообщений: 1,864
Цитата:
Хорошо бы посмотреть ваш код загрузчика с фабрикой
Цитата:
Akopalipsis, я не просил вас развешивать лапшу.
Цитата:
Цитата:
что у вас не получается?
так-как не могу придумать, как обработать текстурный атлас, он же не один, а с xml впаре должен быть
Цитата:
самостоятельно решите вашу проблему, доведя код хоть до какого-то но работоспособного сосотяния
Не знаю о чем Вы ( код у меня рабочий, возможно не на все сто процентов ) но мне все равно, то что я хотел услышать, я услышал о Wolsh'а. И я уже понял как мне сделать, должно быть несколько классов фабрик ( одна обычная, другая для текстурных атласов ) созданные на имплементации общего интерфейса, который и будет обслуживать статический класс Factory. Тут я писать больше не буду, если не попросят ...

Старый 22.03.2014, 23:52
Babylon вне форума Посмотреть профиль Отправить личное сообщение для Babylon Посетить домашнюю страницу Babylon Найти все сообщения от Babylon
  № 10  
Babylon
[+1 25.10.13]
[+4 18.03.14]
 
Аватар для Babylon

Регистрация: Jan 2006
Адрес: Москва, Зеленоград
Сообщений: 653
Отправить сообщение для Babylon с помощью ICQ
Кто мешает писать Уолшу личные сообщения. Ваш код меня не впечатляет.

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

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

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


 


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


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