我正在设计一个库存系统。现在,我需要测试一个物品是否在库存中,以便阶段知道是否在特定级别实例化该物品。作为e.target传递的AS3对象不匹配通过其数组索引传递的相同对象
我添加的项目组中的电平,所以这种代码位于阵列环路“卸载”对应于每个级别的项目的“包”中。
if (inv.indexOf(group[i]) == -1) {
//add item + item functionality
}
这种方法适用当我添加的项目清单,如这样的:
inv.push(group[i]);
if (inv.indexOf(group[i]) == -1) {
//add item + item functionality
}
但是,这并不工作,因为我为什么要添加项目到库存没有收集用户它首先?所以代码实际上是构造成这样:
if (inv.indexOf(group[i]) == -1) {
//if item is not in inventory, add to stage
addChild(group[i]);
//when a user clicks this (any) item,
group[i].addEventListener(MouseEvent.CLICK, function itemFunctionality(e:MouseEvent){
//target item clicked
var item = e.target;
//add the item to the inventory
inv.push(item);
//sidenote: if i were to check inv.indexOf(item) here, i
//would get a positive index. unfortunately,
//i cant check whether the item is in the inventory
//after its already been added to the level...
item.removeEventListener(MouseEvent.CLICK, itemFunctionality);
});
}
问题是,当你离开和回来的水平,你已经收集到的物品重新实例。如果您再次收集项目,则清单会添加您已收集的项目的副本。
的inv.indexOf(group[i])
检查不理解的是,当阵列循环到达相应,item group[i] ==
对象通过inv.push(item)
或者换句话说添加到清单inv.push(e.target)
(其中,当然,我无法直接写入代码) ...
当我跟踪最新静态数组inv
,在阵列内环路什么group[i]
,或者什么e.target
是,它们都输出相同类型的项目为“[object ITEMNAME]”,表示的indexOf内选中SHOULD匹配。
更新:
如果我看来,项目静态以及它们属于这种方法的阵列组的鼠标事件回调中的工作原理:
inv.push(item);
group.splice(group.indexOf(item), 1);
虽然我已删除的项目以及来自他们自己的类的项目组,并将它们放在关卡类本身内......我觉得这种方法很糟糕,因为一切都变得杂乱无章并且分组到同一个类中。
任何有帮助的建议?
这是不是很清楚你是什么意思下“离开并回来”,但据我所知你正在试图检查DisplayObject是否在数组inv中。而这种方法将无法工作。您需要为每个项目添加一个ID,换句话说,您的关卡应该建立在某个模型上。在这个模型中,您可以描述关卡上存在的物品,已连接的物品。这是你的应用程序设计的问题,而不是语言。 – Nbooo