Одновременное удаление прослушивателя событий и спрайта AS3

У меня возникли проблемы с одновременным удалением прослушивателя событий и спрайта. В настоящее время я получаю сообщение об ошибке:

TypeError: Ошибка № 1009: невозможно получить доступ к свойству или методу нулевой ссылки на объект.

И если я закомментирую removeChild, у меня нет ошибки, но, очевидно, спрайт остается на экране. Любые идеи, как я могу избавиться от этой ошибки?

     //Bullet extends Sprite Class
     bullet:Bullet = new Bullet();
     mc.addChild(bullet);
     bullet.addEventListener(Event.ENTER_FRAME, shoot);

     function shoot(e:Event):void {
        var shot:Bullet = e.currentTarget as Bullet;
        //check shot is outside the frame
        if (shot.x < 0 - shot.width || shot.x > stage.stageWidth || shot.y > 525)
        {
            //trying to remove the thing and it's listener
            e.currentTarget.removeEventListener(e.type,arguments.callee);
            e.currentTarget.parent.removeChild(shot);
        }
        else
        {
            shot.setInMotion();
        }
    }

person toast    schedule 04.04.2011    source источник
comment
не забудьте вставить shot.y ‹ 0 - shot.height :)   -  person The_asMan    schedule 05.04.2011
comment
Просто хочу отметить: в общем случае при добавлении прослушивателя событий используйте слабые ссылки, т. е. addEventListener (Event, shoot, false, 0, true), это позволяет компонентам собирать мусор и действует аналогично удалению eventListener.   -  person Drenai    schedule 05.04.2011


Ответы (2)


Кроме отсутствующего var перед bullet:Bullet, я не вижу ничего плохого в коде примера. Вы должны установить точку останова сразу после:

var shot:Bullet = e.currentTarget as Bullet;

И выясните, почему shot имеет значение null. Я подозреваю, что в фрагменте кода что-то не так, кроме того кусочка, который вы приводите в качестве примера. Если код работает только с закомментированной строкой removeChild, он говорит мне, что e.currentTarget не является нулевым, но также не является ссылкой на экземпляр типа Bullet (т. е. приведение «как» возвращает нуль).

person Adam Smith    schedule 04.04.2011
comment
Вы знаете, вы были правы — я забыл, что оставил след вне условного оператора от более раннего. - person toast; 05.04.2011

Попробуйте поменять местами эти строки
Возможно, ссылка на e.currentTarget теряется в ссылках на объекты

e.currentTarget.removeEventListener(e.type,arguments.callee);
e.currentTarget.parent.removeChild(shot);

to

e.currentTarget.parent.removeChild(shot);
e.currentTarget.removeEventListener(e.type,arguments.callee);
person The_asMan    schedule 04.04.2011