Ошибка # 1009 с removeChild на Event.target - PullRequest
0 голосов
/ 05 октября 2011
private function bubbleFlury()
    {
        for (var i = 0; i < fluryAmount; i++)
        {
            fluryBubble = this.addChild(new bubble());
            fluryBubble.addEventListener(Event.ENTER_FRAME, fluryDisplace);
            fluryBubble.yspeed = randomRange(5, 10);

            with (fluryBubble)
            {
                x = Math.random() * sWidth;
                y = randomRange(sHeight, (sHeight+sHeight));
                width = height = 1 + Math.random() * 60;
            }
        }

        function fluryDisplace(e:Event):void
        {
            e.target.y -=  e.target.yspeed;

            if (e.target.y <= 0 - e.target.height)
            {
                var t:DisplayObject = DisplayObject(e.target);
                t.parent.removeChild(t)
            }
        }
    }

Это функция, которую я не могу понять:

function fluryDisplace(e:Event):void
    {
        e.target.y -=  e.target.yspeed;

        if (e.target.y <= 0 - e.target.height)
        {
            var t:DisplayObject = DisplayObject(e.target);
            t.parent.removeChild(t)
        }
    }

Это бросает

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

Я почему-то растерялся.

1 Ответ

2 голосов
/ 05 октября 2011

Когда вы делаете removeChild(), обязательно удалите прослушиватель событий EnterFrame :

function fluryDisplace(e:Event):void
{
    e.target.y -=  e.target.yspeed;

    if (e.target.y <= 0 - e.target.height)
    {
        e.target.removeEventListener(Event.ENTER_FRAME, fluryDisplace);

        var t:DisplayObject = DisplayObject(e.target);
        t.parent.removeChild(t);

    }
}

В противном случае событие продолжается и включается, но DisplayObject больше не имеет parent, и, таким образом, t.parent равно нулю (и вы получите 1009 Error), которого боятся.

Надеюсь, мои объяснения не были слишком запутанными. Кроме того, я советую внимательно прочитать то, что Маттиас пишет в своем комментарии, и постараться не добавлять больше ОДНОГО прослушивателя EnterFrame, поскольку это очень дорого с точки зрения производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...