AS3,从列表错误中删除对象

时间:2014-11-16 17:31:16

标签: actionscript-3 flash actionscript

我有一个对象列表,我试图遍历列表并检查是否发生了碰撞,此时将播放补间动画,最后将执行删除对象的功能。

stage.addEventListener(Event.ENTER_FRAME, hitTest);
function hitTest(e:Event ):void
{
    for each (bullet in bullets)
    {
        if (bullet.parent == null)
        {
            bullets.splice(bullets.indexOf(bullet),1);
        }
        else if (bullet.hitTestObject(shark))
        {
            trace("HIT1");
            bullet.gotoAndPlay(2); //part that's giving me trouble
            bullets.splice(bullets.indexOf(bullet),1);
            trace("HIT");
        }
        else
        {
            for each (enemy in enemies)
            {
                if (enemy !=null && bullet.hitTestObject(enemy))
                {
                    enemies.splice(enemies.indexOf(enemy),1);
                    enemy.remove();
                    enemy = null;
                    bullets.splice(bullets.indexOf(bullet),1);
                    bullet.remove();
                    break;
                }
            }
        }
       }

通过列表测试各种事情。

在Bullet类的子弹对象的补间动画设置结束时

stop();
this.remove();

这是项目符号类中的删除功能

public function remove() {
    parent.removeChild(this);
    this.removeEventListener(Event.ENTER_FRAME, moveMe);
}

特定错误

TypeError: Error #1009: Cannot access a property or method of a null object reference.
at Bullet/remove()
at Bullet/frame20()

第20帧是补间动画的最后一帧,其代码高于^^

感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

从正在迭代的数组中删除项目会更改数组的长度,并可能导致错误。选项是向后迭代数组或者有一个本地临时数组,你将“命中”的索引推入,然后在主for循环完成后从主数组中删除,然后迭代temps数组。 / p>

有关讨论和解决方案示例的类似问题,请参阅herehere