检查精灵数组是否单击了精灵。 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);
(最后一个参数是弱标志)。或者在杀死僵尸时明确删除该事件侦听器。如果你不这样做,即使你已经杀死它并删除了所有其他对它的引用,该事件侦听器也会将该对象保留在内存中。
所以我在 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);
(最后一个参数是弱标志)。或者在杀死僵尸时明确删除该事件侦听器。如果你不这样做,即使你已经杀死它并删除了所有其他对它的引用,该事件侦听器也会将该对象保留在内存中。