2013-05-23 5 views
0

У меня проблема, потому что я пытаюсь удалить любые экземпляры прямоугольника, в то время как сообщение Congratulations находится на экране. Код немного грязный, но я много раз общался с ним, чтобы попытаться понять это. Если я изменю addChild на stage.addChild, это даст мне ошибки из-за стрельбы и их удаления в функции shootMob. Я также назвал его rectangle.parent.removeChild(rectange), но это также не сработает. Есть идеи?RemoveChild Not Working AS3 Flash

function spawnMob1():void 
{ 
    if (gameLevel==1) 
    { 
    var rectangle:MovieClip = new ball_mc(); 
     rectangle.x = randomRange(583); 
    rectangle.y = randomRange(100); 
    addChild(rectangle); 

    var mobMoveX:Tween = new Tween(rectangle, "x", None.easeOut, rectangle.x, character_mc.x, 6, true); 
    var mobMoveY:Tween = new Tween(rectangle, "y", None.easeOut, rectangle.y, character_mc.y, 6, true); 


    rectangle.visible = true; 

    rectangle.addEventListener(MouseEvent.CLICK, shootMob); 
    function shootMob(e:MouseEvent): void 
    { 
     if (contains(rectangle)) 
     { 
      removeChild(rectangle); 
      score_txt.text = String(score); 
     } 
     score+=20; 
     trace("Score:" + score); 
    } 

     if (score>=60) 
     { 
      trace("Congratulations!"); 
      congratulations1_mc.visible = true; 

      trace("GameLevel:" + gameLevel); 


      removeChild(rectangle); 
//   rectangle.visible = false; 

      gameLevel = 0; 

     } 


    character_mc.addEventListener(Event.ENTER_FRAME, charHit); 

    function charHit(event:Event): void 
    { 
     if (rectangle.hitTestObject(character_mc)) 
     { 
      if (contains(rectangle)) 
         { 
         removeChild(rectangle); 
      if (health>0) 
      { 
       health-=5; 
       health_txt.text = String(health); 
       trace("boop"); 
       trace("Health:" + health); 
      } else if (health<=0) { 
        trace("You have died"); 
        death_mc.visible = true; 
        gameLevel=0; 

      } 
    } 

} 
} 
+0

Возможно, проблема с областью действия, как вы используете локальные функции; если нет опечатки в том, что вы указали. Я бы не ссылался на экземпляр «rectangle» из обработчика события мыши - вы полагаетесь на устаревшую ссылку из вашей функции внутри функции. –

ответ

0

Вы потеряли }. shootMob должен включать блок (score>=60).

+0

Спасибо за ваш ответ! Я переместил его в блок Spawnmob, но он все еще остается на сцене. Мобы перестают появляться из-за изменения значения gameLevel и всего, я просто не могу удалить существующие (перемещение к цели), чтобы покинуть сцену. Мне не понравилось размещать функции внутри другой функции, но делать что-то еще, ссылаясь на «прямоугольник», чтобы вызвать ошибки нулевого объекта. – jujumushu

0
Writing one function inside another function is a bad coding style. What about this instead: 

    import flash.events.MouseEvent; 
    import flash.events.Event; 
    import fl.transitions.Tween; 
    import flash.text.TextField; 
    import flash.display.MovieClip; 

var score_txt:TextField = new TextField(50,50,0xFFFFF); 
    var score:Number; 
    var gameLevel:int = 1; 

var rectangle:MovieClip; 

    //function spawnMob1():void 
    //{ 
     if (gameLevel==1) 
     { 
    rectangle = new ball_mc() 

    rectangle.x = randomRange(583); 
    rectangle.y = randomRange(100); 
    addChild(rectangle); 

    var mobMoveX:Tween = new Tween(rectangle,"x",None.easeOut,rectangle.x,character_mc.x,6,true); 
    var mobMoveY:Tween = new Tween(rectangle,"y",None.easeOut,rectangle.y,character_mc.y,6,true); 
    rectangle.visible = true; 

    rectangle.addEventListener(MouseEvent.CLICK, shootMob); 

} 

    function shootMob(e:MouseEvent):void 
    { 
     if (contains(rectangle)) 
     { 
      removeChild(rectangle); 
      score_txt.text = String(score); 
     } 
     score += 20; 
     trace("Score:" + score); 

    if (score>=60) 
    { 
     trace("Congratulations!"); 
     congratulations1_mc.visible = true; 
     trace("GameLevel:" + gameLevel); 
     if(rectangle || congratulations1_mc.visible == true) 
     removeChild(rectangle); 
     gameLevel = 0; 
    } 
} 

    character_mc.addEventListener(Event.ENTER_FRAME, charHit); 

    function charHit(event:Event):void 
    { 
     if (rectangle.hitTestObject(character_mc)) 
     { 
      if (contains(rectangle)) 
      { 
       removeChild(rectangle); 
       if (health>0) 
       { 
        health -= 5; 
        health_txt.text = String(health); 
        trace("boop"); 
        trace("Health:" + health); 
       } 
       else if (health<=0) 
       { 
        trace("You have died"); 
        death_mc.visible = true; 
        gameLevel = 0; 

       } 
      } 
     } 
    } 
+0

Спасибо за ваш ответ! Я пробовал это, и все до сих пор работает нормально, но, очевидно, это только добавление одного ребенка. Как бы вы посоветовали собирать больше икронов? Вернусь ли я обратно в существующий оператор gameLevel == 1 if? – jujumushu

+0

Нет, я просто прокомментировал это из-за упорядочивания кода. если это требует, вы можете добавить это условие. Я не могу понять, что вы проверяете на этом условии gameLevel == 1. в чем необходимость. или объявить эту переменную прямоугольника вне этой функции, поскольку вы можете получить всюду. – Siva

+0

Извините, что я хотел спросить, что если я снова введу метод setInterval (или даже таймер), создание мобов должно быть внутри функции. Если это внутри функции, другие вызовы «прямоугольник» должны быть в этой функции из-за предыдущих ошибок, я не могу получить доступ к «прямоугольнику», не находясь внутри создаваемой им функции. – jujumushu

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