|
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Связь между фабрикой и загрузчиком
Читаю интернет и книжки два дня, но не могу самостоятельно придти к однозначному выбору, по этому прошу объяснить, как наладить связь между загрузчиком и фабрикой. У самого в голове полтора неполных варианта -
1) по запросу с сервера приходит xml-json файл с ссылками, который попав в загрузчик разбирается на объекты и отправляется в массив очереди. По мере загрузки все ассеты попадают в какое-то хранилище, а по окончанию, хранилище передается в фабрику, где.. Где эти ассеты нужно привести к пригодному типу. И вот с этого момента возникает понимание, что без ЧЕГО-ТО не получится правильно разместить ассеты. И вариант 1.5, это когда файл полученный с сервера разбирается на объекты и передается не в загрузчик, а в ДО объекты, которые при ините будут что-то делать.. Но с таким вариантом, ещё больше вопросов.. В общем, объясните на словах ( только подробнее ), как это должно быть? |
|
|||||
Нуб нубам
модератор форума
Регистрация: Jan 2006
Адрес: Бердск, НСО
Сообщений: 6,445
|
Ну так XML должен содержать не просто Кучу ссылок, у каждой ссылки есть идентификатор, указывающий, что это такое будет.
Нетупой загрузчик должен сложить ассеты не просто в Кучу, а в объект с доступами по идентификатору. Фабрика должна знать идентификаторы того, что ей нужно для создания объектов. Тогда ошибка возможна только если вместо ассета "автомат Калашникова" в XML окажется ссылка на ассет "Кукла Маша". Уровни абстракции то не бесконечны. Не надо думать, что программа
__________________
Reality.getBounds(this); |
|
|||||
Регистрация: Dec 2013
Сообщений: 49
|
Я делал так, вроде хорошо работает
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; } } } 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)); } } } |
|
|||||
[+1 25.10.13]
[+4 18.03.14] |
Akopalipsis, дисплей объекту, состоящему из ассетов лучше поставить в соответствие XML объект и дальше делать запросы, фильтры. На выходе у тебя будет XMLList, ids нод, которых связаны с дисплей объектом например так mc[node.@id]. По-моему эта тема уже пошла по десятому кругу.
|
|
|||||
[+4 06.05.14]
|
действительно здолбало... Зачем спрашивать универсальное решение, если его все равно нет? Как нравится так и пиши - ТС - помоему ты уже все темы исчерпал какие только можно. Теперь ты все знаешь и понимаешь, а дальше дело практики.
__________________
Марк Tween |
|
|||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Wolsh Немного лести Вот пока не прочел Ваше сообщение, почему-то мысли в кучу не собирались, Спасибо!
Получилось пока вот как, надо только подумать ещё о "кучном наполнении", так-как не могу придумать, как обработать текстурный атлас, он же не один, а с xml впаре должен быть.. 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); 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. |
|
|||||
listener
|
Akopalipsis, я не просил вас развешивать лапшу. Я просил вас конкретизировать проблему: что у вас не получается? В контексте вопроса "Связь между фабрикой и загрузчиком". Пока я этого не вижу. Или вы соберетесь и сформулируете конкретную проблему, или тема будет закрыта.
Это означает - самостоятельно решите вашу проблему, доведя код хоть до какого-то но работоспособного сосотяния, а потом спрашивайте. Писать вместе с вами ваш проект, вникать в ваши замыслы никто не собирается. |
|
||||||
Banned
[+4 24.02.14]
[+4 07.11.13] [+ 13.03.14] Регистрация: Mar 2013
Сообщений: 1,864
|
Цитата:
Цитата:
Цитата:
Цитата:
|
|
|||||
[+1 25.10.13]
[+4 18.03.14] |
Кто мешает писать Уолшу личные сообщения. Ваш код меня не впечатляет.
|
Часовой пояс GMT +4, время: 14:38. |
|
« Предыдущая тема | Следующая тема » |
|
|