2012-03-29 6 views
0

Ich habe ein einfaches Snake-Spiel gebaut, das eine Main-Klasse (das ist meine Dokumentenklasse), eine Snake-Klasse und eine Food-Klasse verwendet. Die Main-Klasse erstellt ein neues Objekt der Snake-Klasse und ein weiteres der Food-Klasse. Sowohl in der Schlange und Lebensmittelklassen, mache ich Sprites wie so:stage.removeChild Fehler melden

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

Die körper Schlange ist in einer Reihe von Sprites gespeichert segments genannt. Sie können aus diesem Code sehen, dass ich ein neues Sprite mache, um die Länge der Schlange zu verlängern und sie auf das Segmentarray zu schieben. Ich mache etwas ähnliches für irgendwelche Nahrungsmittel, außer innerhalb der Essensklasse, die ich den Essensprite als public var foodSprite:Sprite; definiert habe, weil ich nur einen auf der Bühne zu einer Zeit brauche.

Jetzt, wenn ich die gameOver() Methode aus der Main-Klasse aufrufen (wo ich meine Spielschleife habe), möchte ich stage.removeChild() auf jedem der Schlangensegmente und das Essen Sprite aufrufen. Ich habe versucht, dies zu tun:

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

Aber ich bekomme diese Fehlermeldung:

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

Von dem, was ich weiß, dass dies funktionieren soll, wie this.snake.segments[i] Punkte auf einen Sprit, das eines, die ich von der Bühne entfernt werden soll .

Was könnte hier schiefgehen? Vielen Dank.

EDIT: Ich denke, dass segments Bemerken auch wert ist wie folgt definiert:

public var segments:Array = new Array; 
+0

Sie können '[]' statt 'new Array verwenden () '. 'public var segments: Array = [];' – Marty

Antwort

0

Please see comments on this answer for the actual solution.

Try this:

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

Erhalte immer noch genau den gleichen Fehler mit diesem Code. :/ –

+0

@MartinHoe Wenn das der Fall ist, dann ist, wenn 'snake.segments [i]' nicht 'null' ist, dies nicht das Problem. Führen Sie einige Prüfungen für jede der Eigenschaften von 'gameOver()' durch, wie 'trace (" Segment [i]: "+ snake.segments [i]);' und sehen Sie, ob Sie in der Ausgabe "null" erhalten . – Marty

+0

Okay, ich glaube, ich bin dem Problem näher gekommen. Selbst wenn ich 'trace (this.snake.segments [0])' 'führe, bekomme ich den gleichen Null-Objekt-Referenzfehler. Ich verstehe es wirklich nicht, das Array der Schlangensegmente hat definitiv Elemente, da ich neue Array-Elemente mit seinem Konstruktor einschiebe. –