Среда, 13 Ноября 2024, 13:44

Приветствую Вас Гость

[ Новые сообщения · Игроделы · Правила · Поиск ]
  • Страница 1 из 1
  • 1
Зациклить создание Массива
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");
  • Страница 1 из 1
  • 1
Поиск:

Все права сохранены. GcUp.ru © 2008-2024 Рейтинг