stage.removeChild выдает ошибку

Я создал простую игру про змей, в которой используется класс Main (это класс моего документа), класс Snake и класс Food. Класс Main создает новый объект класса Snake и еще один объект класса Food. В классах Snake и Food я создаю спрайты следующим образом:

var segment:Sprite = new Sprite();
segment.graphics.beginFill(0xFFFFFF);
segment.graphics.drawRect(0, 0, 10, 10);
segment.filters = [new GlowFilter(0xFF6699, .50, 3, 3, 2, 2, false, false)];
segment.graphics.endFill();
segment.x = x;
segment.y = y;
this.stage.addChild(segment);
this.segments.push(segment);

Тело змеи хранится в массиве спрайтов под названием segments. Из этого кода видно, что я создаю новый спрайт для увеличения длины змеи и помещаю его в массив сегментов. Я делаю что-то подобное для любых продуктов питания, за исключением того, что в классе еды я определил спрайт еды как public var foodSprite:Sprite;, потому что мне нужен только один на сцене за раз.

Теперь, когда я вызываю метод gameOver() из класса Main (где у меня есть игровой цикл), я хочу вызвать stage.removeChild() для каждого из сегментов змеи и спрайта еды. Я пытался сделать это:

for(var i:Number = 0; i < this.snake.segments.length; i++)
{
    stage.removeChild(this.snake.segments[i]);
}

Но я получаю эту ошибку:

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

Насколько я знаю, это должно работать, поскольку this.snake.segments[i] указывает на спрайт, который я хочу удалить со сцены.

Что здесь может быть не так? Спасибо.

РЕДАКТИРОВАТЬ: я думаю, также стоит отметить, что segments определяется как:

public var segments:Array = new Array;

person James Dawson    schedule 29.03.2012    source источник
comment
Вы можете использовать [] вместо new Array(). public var segments:Array = [];   -  person Marty    schedule 30.03.2012


Ответы (1)


Пожалуйста, см. комментарии к этому ответу для фактического решения.

Попробуй это:

for(var i:Number = 0; i < snake.segments.length; i++)
{
    var seg:Sprite = snake.segments[i] as Sprite;

    if(seg.parent)
        seg.parent.removeChild(seg);
}
person Marty    schedule 29.03.2012
comment
@MartinHoe Если это так, то, если snake.segments[i] не является null, проблема не в этом. Сделайте некоторые проверки для каждого из свойств, которые у вас есть в gameOver(), таких как trace("Segment[i]: " + snake.segments[i]);, и посмотрите, получите ли вы какие-либо null в выходных данных. - person Marty; 30.03.2012
comment
Ладно, думаю, я приблизился к проблеме. Даже когда я делаю trace(this.snake.segments[0]), я получаю ту же ошибку ссылки на нулевой объект. Я действительно не понимаю, в массиве сегментов змеи определенно есть элементы, когда я добавляю новые элементы массива с помощью его конструктора. - person James Dawson; 30.03.2012
comment
@MartinHoe Что, если вы попробуете trace(this.snake), а также trace(this.snake.segments) - существуют ли они оба в текущем контексте? - person Marty; 30.03.2012
comment
А, получилось. Оказывается, при первом нажатии клавиши this.snake было пустым, потому что я создаю объект змеи после нажатия клавиши. Я просто добавил, если проверить, было ли this.snake нулевым, и если это не так, удалить его. Работает сейчас. :) - person James Dawson; 30.03.2012
comment
@MartinHoe Оттачивайте свои навыки отладки для разработчиков игр :P - person Marty; 30.03.2012