2012-03-29 5 views
0

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

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() из основного класса (где у меня есть игровой цикл), я хочу позвонить 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] указывает на спрайт, тот, который я хочу, чтобы удалить со сцены ,

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

EDIT: Я думаю, это также стоит отметить, что segments определяется как:

public var segments:Array = new Array; 
+0

Вы можете использовать '[]' вместо 'новый Array () '. 'public var segment: Array = [];' – Marty

ответ

0

Please see comments on this answer for the actual solution.

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

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); 
} 
+0

По-прежнему получить ту же ошибку с этим кодом. :/ –

+0

@MartinHoe Если это так, то если 'snake.segments [i]' is 'null', это не проблема. Сделайте несколько проверок на каждое из свойств, которые у вас есть в 'gameOver()' like 'trace (" Сегмент [i]: "+ snake.segments [i]);' и посмотрите, получаете ли вы какие-либо 'null' в выходе , – Marty

+0

Хорошо, я думаю, я стал ближе к проблеме. Даже когда я делаю 'trace (this.snake.segments [0])' Я получаю ту же ошибку ссылки на нулевой объект. Я действительно этого не понимаю, в массиве сегментов змеи определенно есть элементы, поскольку я нажимаю на новые элементы массива со своим конструктором. –