2016-10-08 2 views
2

Я сделал игру с AS3, где вы должны нажать на падающие бомбы, прежде чем они взорвутся и уничтожат стену. Теперь я пытаюсь удалить бомбы, которые упали сразу после разрушения стены, поэтому я сделал removeChild(blob) в своей игре над функцией, так как эти бомбы добавляются на сцену с addChild(blob), и я продолжаю получать эту ошибку:Ошибка AS3 2025 removechild

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

... И, кстати, я уже пробовал такие вещи:

this.parent.removeChild(this); 

или

blob.parent.removeChild(blob); 

или

stage.removeChild(blob); 

, но я все равно получаю ту же ошибку.

Вот мой код:

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


    } 
} 

ответ

2

Значение переменного имя блобо может ссылаться только на один конкретный объект Blob в то время. Каждый раз, когда вы создаете новый Blob, вы переназначаете имя blob на последний созданный, теряя ссылку на предыдущую.

Эта ошибка говорит, что при вызове removeChild конкретный Blob, присвоенный имени «blob», не является дочерним, его нет в списке отображения.

Поэтому его ссылка на неправильный Blob или его уже удален из списка отображения.

Чтобы избежать ошибок, и можно также сказать, что-то вроде если (blob.parent) удаление детской блоб

+0

Я думаю, что вы к чему-то. –

+2

Поэтому вместо этого поместите капли в массив по мере их создания, а затем пропустите этот массив, чтобы уничтожить каждый по номеру индекса вместо переменной ссылки. –

Смежные вопросы