【问题标题】:Checking an array of sprites for sprite clicked. AS3检查精灵数组是否有点击的精灵。 AS3
【发布时间】:2016-03-14 03:10:23
【问题描述】:

所以我在 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;
                });
            }
        }

现在这一切都很好,但我遇到了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!

问题在于使用目标查找精灵的索引,它似乎永远找不到它,并且总是返回-1;如果有人有任何想法,请帮忙!

【问题讨论】:

  • 您的内联鼠标单击处理程序将导致内存泄漏。每个生成的僵尸都会因此而留在内存中。
  • 迭代,我不确定我该如何解决这个问题。

标签: actionscript-3 flash


【解决方案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 是一个自定义类,那么给它一个引用它来自的CreateZombie obj 的属性可能会更容易。

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


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

【讨论】:

  • 谢谢,我现在就重构来解决这个问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 2013-08-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多