我在AS3中制作了一个invetory,允许我将物品放在衣柜里的插槽中,或放在库存的插槽中。它完全有效,但有一个问题。 在游戏中,你应该能够购买新物品并将它们添加到壁橱中。我希望将其保存,以便下次播放时可用。
为此,我想将一个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,这是不可能的。
如果有可能,您能告诉我如何正确地做到这一点吗?
您需要的信息:
- 这些项目都存储在带插槽的壁橱中(壁橱动画片段中的实例)。
- 项目需要在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;
}
}
这样我就会分配一个新名称,并将它们放在插槽中,并使用收到的新名称。
现在我的问题是:
如何制作,以便您可以将项目保存到共享对象,以便下次玩游戏时它们在壁橱中。
很抱歉这个问题很长。
提前致谢,
米兰。
答案 0 :(得分:0)
您无法直接在SharedObject中存储DisplayObject,因为它包含在加载此类对象时无效的内存链接。解决此问题的一种通用方法是存储该对象的重要数据部分。例如,您设计了以下结构:
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()
创建宝石后调用它。您的项目可能只值得在类表中使用类名和ID,因此请将这些项目与插槽编号一起存储,并创建将已设置其所有属性的对象。