2016-12-14 56 views
0

我正在设计一个库存系统。现在,我需要测试一个物品是否在库存中,以便阶段知道是否在特定级别实例化该物品。作为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); 

虽然我已删除的项目以及来自他们自己的类的项目组,并将它们放在关卡类本身内......我觉得这种方法很糟糕,因为一切都变得杂乱无章并且分组到同一个类中。

任何有帮助的建议?

+0

这是不是很清楚你是什么意思下“离开并回来”,但据我所知你正在试图检查DisplayObject是否在数组inv中。而这种方法将无法工作。您需要为每个项目添加一个ID,换句话说,您的关卡应该建立在某个模型上。在这个模型中,您可以描述关卡上存在的物品,已连接的物品。这是你的应用程序设计的问题,而不是语言。 – Nbooo

回答

2

对象与它们的引用相匹配。这意味着从同一个类创建的两个对象不相同,它们是不同的对象。

为您的物品分配唯一的ID并在清单中使用它们。喜欢;

inv.push(item.id); 
if (inv.indexOf(item.id) == -1) { 
    //add item + item functionality 
} 

使用ID对于序列化/反序列化也更好。

2

有你的问题:

问题是,当你离开和回来的水平,你已经收集到的物品重新实例

为什么会回到某种程度导致任何种类的重新定义?

您应该只创建一次每个关卡对象,并且该进程的一部分应创建该关卡中包含的所有对象。仅仅访问一个级别就是与该对象的交互,这可能包括删除对象并将其添加到清单中。一旦物体从关卡中消失,它们就消失了。

重新访问时,没有理由重新实例化一个关卡(或其中的任何对象)。如果你遇到这个问题,因为你正在使用基于时间线的方法来处理帧和gotoAndStop()之间的切换水平,那么这是你的问题的核心,你应该停止这样做。

+0

即时消息不使用时间轴代码,但我在他们之间旅行时重新实例化级别。当你离开一个级别时,它会自行删除,并告诉舞台创建一个你正在旅行的级别的新实例...我现在可以看到这是一个糟糕的设计选择,哈哈。我还会怎么做呢? – carrmx

+0

即时考虑将每个位置放在舞台上并改变它们的坐标来完成这个......但是我觉得这种方法太笨重了......它会减慢游戏速度吗? – carrmx