作为e.target传递的AS3对象与通过其数组索引传递的相同对象不匹配

时间:2016-12-14 03:47:02

标签: arrays actionscript-3 oop

我正在设计一个库存系统。现在,我需要测试一个项目是否在库存中,以便阶段知道是否在特定级别实例化该项目。

我将项目添加到组中的级别,因此此代码位于数组循环中,该循环“卸载”与每个级别对应的项目的“包”。

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在数组循环中,或者inv.push(item); group.splice(group.indexOf(item), 1); 是什么时,它们都输出相同类型的项,“[object itemName]“,表示indexOf检查应该匹配。

更新:
看来,如果我将项目设置为静态以及它们属于的数组,则此方法在鼠标事件回调中起作用:

{{1}}

虽然我必须从他们自己的类中删除项目和项目组,并将它们放在级别类本身...我觉得这种方法很糟糕,因为一切都变得杂乱无章并被分组到同一个类中。 / p>

有用的建议吗?

2 个答案:

答案 0 :(得分:2)

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

为您的商品分配唯一ID,并在您的广告资源中使用它们。等;

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

使用ID也更适合序列化/反序列化。

答案 1 :(得分:2)

你的问题是:

  

问题是当你离开并回到关卡时,你已经收集的项目重新实例化

为什么会回到某种程度导致重新安置?

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

重新访问时,没有理由重新实现某个级别(或其中的任何对象)。如果您遇到此问题,因为您使用基于时间线的方法和帧gotoAndStop()来切换级别,那么这是问题的核心,您应该停止这样做。