检查精灵数组是否单击了精灵。 AS3

Checking an array of sprites for sprite clicked. AS3

所以我在 AS3 中创建了一个僵尸游戏,我创建了一个僵尸精灵数组。每次新一波开始时,它都会根据波的等级创建一定数量的僵尸精灵。这是创建僵尸精灵的函数。

       public function spawnZombies(amount:int):void {
            for (var spawned:int = 0; spawned < amount; spawned++) {
                Stats.zombieAmount += 1;
                zombies.push(new CreateZombie("zombie.png", Math.random()*-(Stats.level * 150), gameHeight - 45));
                addChild(zombies[zombies.length - 1].spriteObj);
                zombies[zombies.length - 1].spriteObj.addEventListener(MouseEvent.CLICK, function killed(evt:MouseEvent):void {
                    Stats.zombieAmount -= 1;
                    Stats.money += 1;
                    moneyText.displayText.text = "$" + Stats.money;
                    trace(zombies.indexOf(evt.currentTarget));
                    removeChild(evt.currentTarget as Sprite);
                    zombies[zombies.indexOf(evt.currentTarget as Sprite)] = null;
                });
            }
        }

现在一切都很好,但我在添加到我创建的每个 sprite 时遇到了问题 eventListiner。问题出在这些代码行中:

trace(zombies.indexOf(evt.currentTarget)); //Returns -1
removeChild(evt.currentTarget as Sprite); //Works fine
zombies[zombies.indexOf(evt.currentTarget as Sprite)] = null; //Sets -1 in list to null, not what I want!

问题在于使用目标查找精灵的索引,它似乎从未找到它,而且总是returns -1;如果有人有任何想法,请帮助!

您的直接问题是您将 CreateZombie 实例存储在 zombies 数组中,但是您的点击侦听器被添加到 spriteObj 中,这是一个 属性 的 CreateZombie 实例添加到数组中。

这意味着在您的点击处理程序中,evt.currentTarget 是对 spriteObj 实例的引用,而不是 CreateZombie 实例。因此,当您执行 indexOf.

时,在数组中找不到它

看起来 spriteObj 中没有对它生成的 CreateZombie 对象的引用。因此,您可能不得不求助于遍历整个数组,试图找到与 spriteObj 一起出现的 Zombie。

function getZombieForSprite(spriteObj){
    for(var i:int=0;i<zombies.length;i++){
        if(zombies[i].spriteObj === spriteObj) return zombies[i]; 
    }
    return null;
}

如果 spriteObj 是自定义的 class,那么给它一个 属性 引用它来自的 CreateZombie obj 可能更容易。

或者,如果 CreateZombie 顾名思义只是一个工厂方法,只需将 spriteObj 存储在 zombies 数组中。


现在,作为避免内存泄漏的提示,您应该使点击侦听器变弱:addEventListener(MouseEvent.CLICK, handler, false, 0, true);(最后一个参数是弱标志)。或者在杀死僵尸时明确删除该事件侦听器。如果你不这样做,即使你已经杀死它并删除了所有其他对它的引用,该事件侦听器也会将该对象保留在内存中。