0

我在 AS3 中创建了一个物品栏,它允许我将物品放在壁橱的插槽中,或者放在物品栏中的插槽中。它完全有效,但有一个问题。在游戏中,您应该能够购买新物品并将它们添加到壁橱中。我希望将其保存下来,以便下次玩时可用。

为此,我想将数组保存到 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,这是不可能的。

如果可能的话,你能告诉我如何正确地做到这一点吗?

您需要的资料:

- 这些物品都存储在带有插槽的壁橱中(壁橱中的影片剪辑中的实例)。

- 项目需要在 for 循环中获取名称 slotTC + 整数。

- 当您将它们从壁橱中取出或放回壁橱时,物品的名称会根据它们分配的插槽编号而变化。

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;
}
}

通过这种方式,我分配了一个新名称并将它们放置在带有他们收到的新名称的插槽中。

所以现在我的问题:

如何做到这一点,以便您可以将项目保存到共享对象,以便下次玩游戏时将它们放在壁橱中。

对不起,很长的问题。

提前致谢,

米兰。

4

1 回答 1

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];
}

整个解决方案可以针对特定任务进行定制,例如,在我的游戏中,我有宝石,它们的位置、类型、大小和分数不同,所以我只存储这些值,然后我创建新的宝石,设置位置、类型、大小并使用一个函数进行评分,该函数设置该 gem 的所有其他相关参数以与存储的信息对齐,并在使用new Gem(). 您的项目也可能只值得在类表中使用类名和 ID,因此将它们与插槽号一起存储并创建已设置其所有属性的对象。

于 2013-05-13T11:54:48.627 回答