stage.removeChild выдает ошибку - PullRequest
0 голосов
/ 30 марта 2012

Я построил простую игру со змеями, в которой используется класс 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;

1 Ответ

0 голосов
/ 30 марта 2012

См. Комментарии к этому ответу для фактического решения.

Попробуйте:

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);
}
...