2016-10-08 3 views
2

Ich machte ein Spiel mit AS3, wo Sie auf fallende Bomben klicken müssen, bevor sie explodieren und eine Mauer zerstören. Jetzt versuche ich, die Bomben zu entfernen, die gerade gefallen sind, als die Wand zerstört wurde, also habe ich eine removeChild(blob) in meiner Spielüber-Funktion gemacht, da diese Bomben mit einer addChild(blob) auf der Bühne hinzugefügt werden, und ich bekomme diesen Fehler:AS3 Fehler 2025 removechild

ArgumentError: Error #2025: The supplied DisplayObject must be a child of the caller. ...line 80

... und übrigens, ich habe bereits versucht, Dinge wie diese:

this.parent.removeChild(this); 

oder

blob.parent.removeChild(blob); 

oder

stage.removeChild(blob); 

aber ich bekomme immer noch den gleichen Fehler.

Hier ist mein Code:

package cem { 

    import flash.geom.*; 
    import flash.display.*; 
    import flash.events.*; 
    import flash.display.MovieClip; 
    import flash.utils.Timer; 



    public class Jeu extends MovieClip { 

     //Variables publiques 
     var decor: MovieClip = new Decor(); 
     var chrono: cem.Chronometre; 
     var nextObject: Timer = new Timer(800, 0); 
     var _menu: MovieClip = new Menu(); 
     var _btnJouer: MovieClip = new BoutonJouer(); 
     var blob: cem.Blob; 
     var score: Score; 

     public function Jeu() { 
      // constructor code 

      //***********************************************Mettre menu***********************************************// 
      addChild(_menu); 

      addChild(_btnJouer); 
      _btnJouer.x = 500; 
      _btnJouer.y = 500; 
      _btnJouer.addEventListener(MouseEvent.CLICK, jouer); 
     } 



     //*****************************************************Jouer**************************************************// 
     function jouer(e: MouseEvent) { 

      removeChild(_menu); 

      addChild(decor); 
      decor.gotoAndStop(1); 

      chrono = new cem.Chronometre(); 
      addChild(chrono); 
      chrono.demarrer(); 
      score = new Score(); 
      score.x = 600; 


      nextObject.addEventListener(TimerEvent.TIMER, creerBlobs); 
      nextObject.start(); 



     } 

     //**************************************************Créer Bombes***********************************************// 
     function creerBlobs(e: TimerEvent) { 
      blob = new cem.Blob(); 
      blob.x = Math.floor(Math.random() * (stage.stageWidth - blob.width)); 
      addChild(blob); 
      blob.gotoAndStop(1); 
      blob.addEventListener("explosion", perdreVies); 
     } 

     //************************************************Perdre des vies*********************************************// 
     public function perdreVies(e: Event) { 
      decor.moinsVie(); 
      decor.addEventListener("gameisover", _gameOver); 
     } 

     //************************************************Partie terminée*********************************************// 
     public function _gameOver(e: Event) { 




      blob.removeEventListener("explosion", perdreVies); 


      removeChild(blob); 


      chrono.arret(); 
      addChild(_menu); 
      addChild(_btnJouer); 

      nextObject.stop(); 
      nextObject.removeEventListener(TimerEvent.TIMER, creerBlobs); 
      nextObject.removeEventListener(TimerEvent.TIMER, creerBlobs); 


      addChild(score); 
      score.affichageScore.text = "votre score: " + chrono.secondes * 1000; 
     } 


    } 
} 

Antwort

2

Die var name Blob zu einem Zeitpunkt nur ein bestimmtes Blob-Objekt verweisen kann. Jedes Mal, wenn Sie einen neuen Blob erstellen, weisen Sie den Namen Blob dem zuletzt erstellten zu und verlieren dabei den Verweis auf den vorherigen.

Dieser Fehler besagt, dass beim Aufruf von removeChild das spezifische Blob, das dem Namen "blob" zugeordnet ist, kein Kind ist, es ist nicht in der Anzeigeliste.

Also seine Verweisung auf den falschen Blob oder seine bereits aus der Anzeigeliste entfernt.

Fehler zu vermeiden u auch so etwas wie if (blob.parent) sagen kann, Kind blob

+0

Ich glaube, Sie sind auf dem richtigen Weg entfernen. –

+2

Setzen Sie stattdessen die Blobs in ein Array, während Sie sie erstellen, und durchlaufen Sie dann das Array, um jedes durch eine Indexnummer anstelle eines Variablenverweises zu zerstören. –