2013-05-13 6 views
0

Я сделал invetory в AS3, который позволяет мне помещать предметы на слоты в шкафу или в слоты в инвентаре. Он полностью работает, но есть одна проблема. В игре вы должны иметь возможность покупать новые предметы и добавлять их в шкаф. Я хочу, чтобы это было сохранено, чтобы оно было доступно в следующий раз, когда вы играете.Сохраните элементы (MovieClips) и динамически создайте их

Для этого я хочу сохранить Array в SharedObject, а затем создать элементы динамически из массива.

Сейчас я использую старомодную жесткую кодировку для каждого объекта;

  Itemwrench = new WrenchItem(); 
      Itemwrench.x = par.toolCloset.kast_1.slotTC1.x + 400; 
      Itemwrench.y = par.toolCloset.kast_1.slotTC1.y + 245; 
      Itemwrench.gotoAndStop(2); 
      Itemwrench.name = "slotTC1"; 
      Itemwrench.TC = 1; 
      NotinventoryParentTC.addChild(Itemwrench); 

Однако, чтобы добавить их динамически я должен был бы использовать getChildByName, прежде чем он будет добавлен к стадии, что невозможно.

Если возможно, вы можете показать мне, как это сделать правильно?

Нужная информация:

-The пункты все хранится в шкафу с прорезями (экземпляров в шкафу мувиклипе).

-При необходимости получить имя slotTC + целое число в цикле for.

-Имя элементов изменяется в соответствии с номером слота, который они назначают, когда вы вынимаете их из шкафа или кладете обратно в шкаф.

for(var i:int = 0; i < itemsInTC.length - itemsInTC.indexOf(e.currentTarget.name) - 1; i++) 
{ 
nextSlotTC = "slotTC" + (itemsInTC.indexOf(e.currentTarget.name) +2 +i); 
trace("Next Slot: " + nextSlotTC); 
TempStrTC = "slotTC" + (itemsInTC.indexOf(e.currentTarget.name) +1 +i).toString(); 
trace("temp string: " + TempStrTC);                              
NotinventoryParentTC.getChildByName(nextSlotTC).x = 
par.toolCloset.kast_1.getChildByName(TempStrTC).x + 400; 
NotinventoryParentTC.getChildByName(nextSlotTC).y = 
par.toolCloset.kast_1.getChildByName(TempStrTC).y + 245; 
if(Boolean(NotinventoryParentTC.getChildByName(nextSlotTC))) 
{ 
    NotinventoryParentTC.getChildByName(nextSlotTC).name = TempStrTC; 
} 
} 

Таким образом, я назначаю новое имя и помещаю его в слот с новым именем, которое они получили.

Так что теперь мой вопрос:

Как сделать так, что вы можете сохранить детали к общему объекту, так что они находятся в шкафу в следующий раз, когда вы играете в игру.

Извините за длинный вопрос.

Заранее благодарен,

Милан.

ответ

0

Вы не можете непосредственно сохранить объект DisplayObject в SharedObject, так как он содержит ссылки на ячейки памяти, которые не будут действительны при загрузке такого объекта. Способ совместной работы заключается в том, чтобы хранить значительную часть данных этого объекта. Например, разработать следующую структуру:

class SlotStructure { 
    public var slotID:int; 
    public var itemID:int; 
    public var itemName:String; 
    public var itemParameters:Array; // stuff simple types here 
} 

Затем для каждого из элементов в инвентаре, вы генерировать SlotStructure объект, описывающий конкретный объект инвентаризации. Для вашего гаечного ключа это может выглядеть так:

var ss:SlotStructure=new SlotStructure(); 
ss.slotID=1; 
ss.itemID=getID(item); // assuming a function that returns a type of an item 
ss.itemName=item.name; 
ss.itemParameters=new Array(); 
for (var param:String in item) ss.itemParameters.push({name:param,value:item[param]}); 

Затем вы храните массив из них в свой SharedObject.Для того, чтобы получить инвентарь от SharedObject вы делаете:

public static const 
registerClassAlias("SlotStructure",SlotStructure); // to be able to typecast from SO 
for (var i:int=0;i<slots.length;i++) { 
    var ss:SlotStructure=slots[i]; 
    var item:Item=new getClassFromID(ss.itemID)(); // a function that returns class 
    // say 1 - wrench, 2 - short sword, 3 - long sword, etc, one type=one ID 
    for each (var o:Object in ss.itemParameters) 
     item[o.name]=o.value; 
    placeIntoSlot(item,ss.slotID); // this does manipulation with x&y and display 
} 

Функция getClassByID() может выглядеть следующим образом:

private static const CLASSES:Array= 
    [StoneItem,WrenchItem,ShortswordItem,LongswordItem,...]; 
// manually stuff all your items in this! 
public function getClassByID(id:int):Class { 
    return CLASSES[id]; 
} 

Всем раствор может быть адаптирован к конкретной задаче, например, в моей игре у меня есть драгоценные камни, которые отличаются по местоположению, типу, размеру и оценке, поэтому я сохраняю только эти значения, а затем создаю новые драгоценные камни, задаю местоположение, тип, размер и оценку с помощью одной функции, которая устанавливает все другие соответствующие параметры этого драгоценного камня для выравнивания с сохраненную информацию и назовите ее после создания драгоценного камня с new Gem(). Ваши элементы могут быть слишком достойны имени класса и идентификатора в таблице классов, поэтому сохраните их с номерами слотов и создайте объекты, которые будут иметь все свои свойства уже установлены.

+0

Позвольте мне попробовать! :) – MilanSxD

+0

Я вижу, как это работает, но мне пришлось бы изменить весь мой код ^^ ' – MilanSxD

+0

Я как-нибудь это выясню. Спасибо за вашу помощь :) Я запомню использовать эту систему в следующий раз. :) – MilanSxD

Смежные вопросы