Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Связь между фабрикой и загрузчиком (http://www.flasher.ru/forum/showthread.php?t=207064)

Akopalipsis 21.03.2014 17:36

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

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

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

Wolsh 21.03.2014 20:10

Ну так XML должен содержать не просто Кучу ссылок, у каждой ссылки есть идентификатор, указывающий, что это такое будет.
Нетупой загрузчик должен сложить ассеты не просто в Кучу, а в объект с доступами по идентификатору.
Фабрика должна знать идентификаторы того, что ей нужно для создания объектов.
Тогда ошибка возможна только если вместо ассета "автомат Калашникова" в XML окажется ссылка на ассет "Кукла Маша". Уровни абстракции то не бесконечны. Не надо думать, что программа может должна уметь принять что угодно и как-то сделать из этого конфетку. Не что угодно. Автомат значит автомат. Программа должна получить автомат. А уж как его нарисует дизайнер в текущей версии — это и есть свобода.

alexcon314 21.03.2014 22:52

Хорошо бы посмотреть ваш код загрузчика с фабрикой, что вы пытаетесь связать. Конкретизировать проблему, так сказать. Или опять будем обсуждать сферического коня в вакууме?

kotyavo 21.03.2014 23:17

Я делал так, вроде хорошо работает

Код 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));
 
                }
        }
 
}


Babylon 22.03.2014 00:44

Akopalipsis, дисплей объекту, состоящему из ассетов лучше поставить в соответствие XML объект и дальше делать запросы, фильтры. На выходе у тебя будет XMLList, ids нод, которых связаны с дисплей объектом например так mc[node.@id]. По-моему эта тема уже пошла по десятому кругу.

in4core 22.03.2014 02:52

действительно здолбало... Зачем спрашивать универсальное решение, если его все равно нет? Как нравится так и пиши - ТС - помоему ты уже все темы исчерпал какие только можно. Теперь ты все знаешь и понимаешь, а дальше дело практики.

Akopalipsis 22.03.2014 21:36

Wolsh Немного лести:D Вот пока не прочел Ваше сообщение, почему-то мысли в кучу не собирались, Спасибо!

Получилось пока вот как, надо только подумать ещё о "кучном наполнении", так-как не могу придумать, как обработать текстурный атлас, он же не один, а с 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;
                }
        }
 
}


alexcon314 22.03.2014 23:10

Akopalipsis, я не просил вас развешивать лапшу. Я просил вас конкретизировать проблему: что у вас не получается? В контексте вопроса "Связь между фабрикой и загрузчиком". Пока я этого не вижу. Или вы соберетесь и сформулируете конкретную проблему, или тема будет закрыта.
Это означает - самостоятельно решите вашу проблему, доведя код хоть до какого-то но работоспособного сосотяния, а потом спрашивайте. Писать вместе с вами ваш проект, вникать в ваши замыслы никто не собирается.

Akopalipsis 22.03.2014 23:36

Цитата:

Хорошо бы посмотреть ваш код загрузчика с фабрикой
Цитата:

Akopalipsis, я не просил вас развешивать лапшу.
Цитата:

Цитата:

что у вас не получается?
так-как не могу придумать, как обработать текстурный атлас, он же не один, а с xml впаре должен быть
Цитата:

самостоятельно решите вашу проблему, доведя код хоть до какого-то но работоспособного сосотяния
Не знаю о чем Вы ( код у меня рабочий, возможно не на все сто процентов ) но мне все равно, то что я хотел услышать, я услышал о Wolsh'а. И я уже понял как мне сделать, должно быть несколько классов фабрик ( одна обычная, другая для текстурных атласов ) созданные на имплементации общего интерфейса, который и будет обслуживать статический класс Factory. Тут я писать больше не буду, если не попросят :) ...

Babylon 22.03.2014 23:52

Кто мешает писать Уолшу личные сообщения. Ваш код меня не впечатляет.


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

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