Зациклить создание Массива
| |
danone | Дата: Вторник, 06 Ноября 2012, 16:34 | Сообщение # 1 |
частый гость
Сейчас нет на сайте
| Всем привет.Прошу помощи. Мне с сервера приходит значения для разных построек (есть как стринг так и инт) и кол-во таких значений для таких построек разное и построек миллион.Я хотел бы добавить массив со всеми значениями для каждого здания(т.к в последействии придется обращаться к каждому значению в отдельности). И хотелось бы зациклить создание нового массива например(build1,build2....) но с этим возникли проблемы.
1.Возможно ли это? и если да, то как? 2.Наверно это тупость, но пока не придумал других вариантов, может быть вы мне подскажете другой вариант?
|
|
| |
TreinDSM | Дата: Вторник, 06 Ноября 2012, 20:16 | Сообщение # 2 |
почетный гость
Сейчас нет на сайте
| Взрыв мозга...
В каком виде Вам с сервера приходят значения для "разных построек"?
|
|
| |
danone | Дата: Вторник, 06 Ноября 2012, 21:17 | Сообщение # 3 |
частый гость
Сейчас нет на сайте
| )) поэтому я предположил что может быть легче вариант. В общем приходит много много много я приведу пример для одного:
а таких много приходит из xml я разбил это по массивам например: по ресурсам, значениям и ценам и т.д. потом из каждого масива(res,type) собрал нужные значения в новый массив(building1) и получил вот такую Code wall,-2,food,400,wood,6000,stone,5000,ore,200,DivineProvidence,10,SacredProvidence,12 и таких построек оч много и что бы их не создавать рукамии хочу зациклить.
|
|
| |
TreinDSM | Дата: Вторник, 06 Ноября 2012, 22:23 | Сообщение # 4 |
почетный гость
Сейчас нет на сайте
| Взрыв мозга - это то как Вы формулируете проблему.
Я без понятия как у Вас выглядит структура xml-ного конфига. Предположим, что там по тегам разбиты наборы свойств зданий различного вида. Например, вот так: Code <buildings>
<building id="0" type="0"> <name>Школа</name> <capacity>100</capacity> </building>
<building id="1" type="1"> <name>Банк</name> <cost>1500</cost> </building>
<building id="2" type="2"> <name>Участок</name> <capacity>100</capacity> <armor>1.5</armor> </building>
</buildings>
Вы можете пробежаться по списку зданий и запихать все их свойство по массивам следующим образом: Code var mainArray:Array = new Array(); for each(var item:XML in xml.building) { var locArray = new Array(); var i:int = 0; while(i<item.attribute().length) { locArray.push(item.attribute(i)); i++; } i= 0; while(i<item.children().length) { locArray.push(item.children(i)); i++; } mainArray.push(locArray); }
Таким образом пробегаем по всем атрибутам и тегам конфига.
Однако массив нетипизированных массивов - это грех в глазах императора. Делать так весьма дурной тон. Я бы сделал бы общий интерфейс под модель данных здания. Если применительно к моему примеру, то вот такой: Code interface IBuildingModel { function init(xml:XML):void;
function get id():int;
function get type():int; }
Потом бы сделал модели зданий, которые имплементят данные интерфейс. Моделей было бы столько, сколько есть уникальных типов зданий. По примеру - их три: школа, банк, участок. Каждая из моделей точно бы знала, какими свойствами она может обладать. Примерно так: Code class School implements IBuildingModel { private var _id:int; private var _type:int; private var _name:String; private var _capacity:int; public function School() {
}
public function init(xml:XML):void { _id = parseInt(xml.attribute("id")); _type= parseInt(xml.attribute("type")); _name= xml.attribute("name"); _capacity= parseInt(xml.child("capacity")); }
public function get type():int { return(_type); }
public function get id():int { return(_id); } }
Участок и банк аналогичным образом, только со своим набором свойств. Когда получаю xml-ку, пробегаюсь по всем структурам в ней, определяю к какому типу ее отнести и создаю нужную модель: Code var list:Vector.<IBuildingModel> = new Vector.<IBuildingModel>() for each(var item:XML in xml.building) { var type:int = parseInt(item.attribute("type")); var model:IBuildingModel; switch(type) { case 0: model = new School(); break
case 1: model = new Bank(); break
case 2: model = new Police(); break; } model.init(item); list.push(model); }
Получаем удобный вектор из вполне понятных моделей зданий.
|
|
| |
danone | Дата: Пятница, 09 Ноября 2012, 14:30 | Сообщение # 5 |
частый гость
Сейчас нет на сайте
| Спасибо, да так гораздо красивей.Но сделал такую же структуру, но мне возвращает результат: Code [object Castle],[object Castle],[object Castle],[object Castle],[object Castle],[object Castle],[object Castle],[object Castle],[object Castle],[object Castle],[object Castle],[object Castle],[object Castle],[object Castle],[object Castle],[object Castle],[object Castle],[object Castle] вместо Code castle home barracks lab wall workshop embassy farm mine sawmill quarry stable blacksmith storehouse knightsHall watchTower reliefStation rallyPoint
2. И вопрос остался открытом можно как нибудь сделать так что бы не вписывать каждое здание(или создавать для него класс), а что бы создать цикл который сам будет создавать массив или класс и туда записывать данные зданий)
3. структура XML выглядит так: Code <rules> <buildings> <building type="castle" title="Замок" image="http://buildings/castle.png" constructTime="1800"> <requirements type="building" quantity="-2" buildingType="wall"/> <requirements type="resource" quantity="400" resourceType="food"/> <requirements type="resource" quantity="6000" resourceType="wood"/> <requirements type="resource" quantity="5000" resourceType="stone"/> <requirements type="resource" quantity="200" resourceType="ore"/> <requirements type="gameObject" quantity="10" objectType="DivineProvidence"/> <requirements type="gameObject" quantity="12" objectType="SacredProvidence"/> </building> <building type="home" title="Дом" image="http://buildings/home.png" constructTime="30"> <requirements type="building" quantity="0" buildingType="castle"/> <requirements type="resource" quantity="100" resourceType="food"/> <requirements type="resource" quantity="500" resourceType="wood"/> <requirements type="resource" quantity="100" resourceType="stone"/> <requirements type="resource" quantity="50" resourceType="ore"/> <requirements type="building" quantity="-1" buildingType="castle"/> <requirements type="gameObject" quantity="10" objectType="DivineInspiration"/> <requirements type="gameObject" quantity="12" objectType="SacredInspiration"/> </building>
|
|
| |
TreinDSM | Дата: Пятница, 09 Ноября 2012, 20:20 | Сообщение # 6 |
почетный гость
Сейчас нет на сайте
| danone, Quote Но сделал такую же структуру, но мне возвращает результат:
В ответ на что Вам возвращают такой результат? И в каком случае Вы хотели получить ниже представленный результат?
Я так понимаю, Вы просто трейсите вектор Ваших моделей зданий. Если у класс, отвечающего за здание не определен метод toString(), то при распечатке будет выдаваться имя класса, что мы и видим.
Классы описываете Вы сами. В цикле можно создавать объекты. Я в 4-м сообщении, во втором листинге привел пример, как можно получить массив из массивов значений здания. Если очень хочется, то можно получить массив из нетипизированных объектов: Code var mainArray:Array = new Array(); for each(var item:XML in xml.building) { var obj = { type: item.attribute("type"), title: item.attribute("title"), image: item.attribute("image"), infoArray: item.children() }; mainArray.push(obj); }
Но еще раз повторюсь, что такой подход порочен - Вы получите массив, при работе с которым никогда не сможете поручиться наверняка, что в нем есть и что это такое. Гораздо лучше не лениться и описать необходимое кол-во моделей, в которых будут четко определены необходимые свойства. Тем более что по приведенной структуре конфига модели достаточно однообразны и различаются в основном значением свойств.
|
|
| |
danone | Дата: Вторник, 13 Ноября 2012, 17:01 | Сообщение # 7 |
частый гость
Сейчас нет на сайте
| Спасибо, разобрался с твоей помощью. Но вот еще одна проблема как пробежаться по всем структурам в XML-ке, определяя к какому типу ее отнести и создать нужную модель если в примере который ты привел type:int а у меня там все String. И как обращаться в последствии, например если мне нужно значение image в классе Castle.
Сообщение отредактировал danone - Вторник, 13 Ноября 2012, 17:31 |
|
| |
TreinDSM | Дата: Среда, 14 Ноября 2012, 20:15 | Сообщение # 8 |
почетный гость
Сейчас нет на сайте
| danone, Я бы завел отдельный класс под константы типов зданий, чтобы все возможные значения хранились в одном месте. Как то так: Code class BuildingTypes { public static const CASTLE:Strint = "castle"; public static const HOME:String = "home"; // public function BuildingTypes() { throw new IllegialOperationError("Класс является статическим!!!") } Потом бы использовал эти константы при парсинге xml. Если отталкиваться от уже озвученного варианта, но с учетом другого того, что type - String: Code var list:Vector.<IBuildingModel> = new Vector.<IBuildingModel>() for each(var item:XML in xml.building) { var type:int = parseInt(item.attribute("type")); var model:IBuildingModel; switch(type) { case BuildingTypes.CASTLE: model = new Castle(); // Нужная модель под тип castle break;
case BuildingTypes.HOME: model = new Home(); // Нужная модель под тип home break; } model.init(item); list.push(model); } Оператор switch может принимать не только int. В case нужно указывать различные варианты того, чему может быть равен передаваемый в switch параметр. Если type является int, то можно использовать 0,1,3,-5 и т.д. Если String, то любые строки. Естественно можно использовать параметры и иных типов.
По поводу значение image. Если данный параметр является общим для всех моделей здания, то можно добавить в интерфейс зданий следующий метод: Code function get image():String;
В классах, которые расширяют данный интерфейс нужно реализовать данный метод. Ниже приведен упрощенный пример: Code class Castle implements IBuildingModel { private var _title:String; private var _type:String; private var _image:String;
public function Castle() {
}
public function init(xml:XML):void { _title = xml.attribute("title"); _type= xml.attribute("type"); _image= xml.attribute("image"); }
public function get type():String { return(_type); }
public function get title():String { return(_title); }
public function get image():String // Реализуем геттер для обращения к свойству image { return(_image); } } Тогда свойство image можно вытащить при обращению к объекту, как к представителю IBuildingModel. Если свойство image является уникальным для какой-то конкретной модели (например, в Castle оно есть, а в Home нет), тогда его нет нужды выводить в общий интерфейс, оно будет частным свойством модели Castle. К нему можно будет обратиться так: Code function someMethod(building:IBuildingModel):void { if(building is Castle) { var castle:Castle = building as Castle; var image:String = castle.image; } } Если подытожить, то могу посоветовать вынести все общие свойства в общий интерфейс моделей зданий. А для обращения к частным свойствам использовать приведение к типу аля как в методе someMethod.Добавлено (14.11.2012, 20:15) --------------------------------------------- Скопировал старый листинг и не посмотрел. Если type является String, то считать его из xml нужно так: Code var type:String = item.attribute("type");
|
|
| |
|