2015-05-28 24 views
0

我试图从舞台上删除此项目并不断收到此错误。代码似乎工作和对象被删除,但游戏似乎有点儿车。我不断收到'ArgumentError:错误#2025:提供的DisplayObject必须是调用者的子节点'内部计时器事件

以下是完整的错误:“引发ArgumentError:错误#2025:提供的DisplayObject必须是调用者的子 在flash.display使用::级DisplayObjectContainer/removeChild之() 在JumpingGame/onTick2()[E:\文件夹\文件夹\文件夹\文件夹\ JumpingGame.as:95] 在flash.utils ::定时器/ _timerDispatch() 在flash.utils ::定时器/蜱()”

错误指向:

  • removeChild(enemy)
  • removeChild之(腿);
  • removeChild(life);

我也越来越:“类型错误:错误#1009:无法访问空对象引用的属性或方法”在这条线上theLives.text = liveLives.toString();

这里是我的代码:

package 
{ 
    import flash.display.MovieClip; 
    import flash.utils.Timer; 
    import flash.events.TimerEvent; 

    public class JumpingGame extends MovieClip 
    { 
     public var army:Array; 
     public var powerups:Array; 
     public var pluslives:Array; 

     public var newDoodle:doodle; 

     public var enemyTimer:Timer; 
     public var legTimer:Timer; 
     public var lifeTimer:Timer; 

     public function JumpingGame() 
     { 

      enemyTimer = new Timer(40); 
      enemyTimer.addEventListener(TimerEvent.TIMER, onTick); 
      enemyTimer.start(); 

      legTimer = new Timer(20); 
      legTimer.addEventListener(TimerEvent.TIMER, onTick2); 
      legTimer.start(); 

      lifeTimer = new Timer(30); 
      lifeTimer.addEventListener(TimerEvent.TIMER, onTick3); 
      lifeTimer.start(); 

      army = new Array(); 
      var newEnemy = new Enemy(100, -15); 
      army.push(newEnemy); 
      addChild(newEnemy); 

      powerups = new Array(); 
      var newLeg = new Leg(300, -15); 
      powerups.push(newLeg); 
      addChild(newLeg); 

      pluslives = new Array(); 
      var newLife = new Plus1(300, -15); 
      pluslives.push(newLife); 
      addChild(newLife); 

      newDoodle = new doodle(); 
      addChild(newDoodle); 
      newDoodle.y = stage.stageHeight - 50; 
      newDoodle.x = stage.stageWidth/2; 
     } 

     public function onTick(timerEvent:TimerEvent):void 
     { 
      if (Math.random() <0.005) 
      { 
       var randomX:Number = Math.random() * 320; 
       var newEnemy:Enemy = new Enemy(randomX, -15); 
       army.push(newEnemy); 
       addChild(newEnemy); 
      } 

      for each (var enemy:Enemy in army) 
      { 
       enemy.moveDownABit(); 
       if (newDoodle.hitTestObject(enemy)) 
       { 
        //gotoAndPlay ("Game Over"); 
        removeChild(enemy); 
        liveLives -= 1; 
        theLives.text = liveLives.toString(); 

       } 
      } 
     } 

     public function onTick2(timerEvent:TimerEvent):void 
     { 
      if (Math.random() <0.008) 
      { 
       var randomX2:Number = Math.random() * 320; 
       var newLeg:Leg = new Leg(randomX2, -15); 
       powerups.push(newLeg); 
       addChild(newLeg); 
      } 

      for each (var leg:Leg in powerups) 
      { 
       leg.moveDownABit2(); 
       if (newDoodle.hitTestObject(leg)) 
       { 
        //gotoAndPlay ("Game Over"); 
        removeChild(leg); 
        liveScore += 2000; 
        theScore.text = liveScore.toString(); 
       } 
      } 

     } 

     public function onTick3(timerEvent:TimerEvent):void 
     { 
      if (Math.random() <0.001) 
      { 
       var randomX3:Number = Math.random() * 320; 
       var newLife:Plus1 = new Plus1(randomX3, -15); 
       pluslives.push(newLife); 
       addChild(newLife); 
      } 

      for each (var life:Plus1 in pluslives) 
      { 
       life.moveDownABit3(); 
       if (newDoodle.hitTestObject(life)) 
       { 
        //gotoAndPlay ("Game Over"); 
        removeChild(life); 
        liveLives += 1; 
        theLives.text = liveLives.toString(); 

       } 
      } 

     } 
    } 
} 
+0

你在哪里初始化 “liveLives” 变量? – Mana

+0

我在我的时间轴代码中有我的liveLives变量,现在我已经将它作为公共变量移动到了类中,它似乎完成了这项工作 – Ceejay1705

+0

当我有类似的错误时,我初始化变量,在你的情况下,敌人'Enemy'类型,'Plus1'类型的生命本身并且错误似乎消失。尝试添加'public var enemy:Enemy;','public var leg:Leg;'以及您在循环参数中初始化的所有其他类型以及类的其他成员声明,​​并告诉我它是否有效。 – Mana

回答

0

尝试使用:

enemy.parent.removeChild(enemy) 
leg.parent.removeChild(leg); 
life.parent.removeChild(life); 

而且没有liveLives var或stage上的theLives文本字段拼写错误。

+0

好吧,我这样做,我现在得到TypeError:错误#1009:对于enemy.parent.removeChild(敌人)。我把敌人的踪迹放在enemy.parent上,它会返回为空 – Ceejay1705

+0

并且当你输入时:对于每个敌人(var enemy:军队敌人) {trace(army.length);它输出了什么? – Antizam

+0

每当玩家与敌人发生冲突时,输出会增加'1' – Ceejay1705

0

你是通过从显示列表中的对象,而不会从你把它们存储在数据结构中去除它们造成的问题

看看从你的代码的摘录: 假设powerups只有一个元素,hitTestObject返回true。该对象从显示中删除。

for each (var leg:Leg in powerups) 
{ 
    if (newDoodle.hitTestObject(leg)) 
    { 
     removeChild(leg); 

代码第二次执行。该对象是数组中的仍然是hitTestObject仍然返回true。对象不能从显示中删除,因为它在第一次执行该功能时已被删除。

您有两种数据结构:显示列表和阵列,它们不同步。

为了解决这个问题,从数组中删除的对象,而不是仅仅显示列表:

  1. 找到您要使用indexOf()
  2. 删除与该索引处删除元素的对象的索引splice()
+0

好吧,这是有道理的。我怎么去做这件事,因为我已经尝试了几件事情,但仍然不确定。 – Ceejay1705

+0

我也做过“追踪(leg.parent)”;“没有removeChild代码,它输出“[object JumpingGame]” – Ceejay1705

+0

@ Ceejay1705我编辑了我的帖子,并包含了一些关于如何删除元素的指示 – null

0

在这种情况下,您不应该使用3数组来存储子对象。简单的说,你创建了3个空的影片剪辑并添加孩子。在那之后,你在击中测试时将它们移除。

类似的东西:

public function onTick(timerEvent:TimerEvent):void 
    { 
     if (Math.random() <0.005) 
     { 
      var randomX:Number = Math.random() * 320; 
      var newEnemy:Enemy = new Enemy(randomX, -15); 
      armyContainer.addChild(newEnemy); 
     } 

     var childs:Array = []; 
     for (var i:int = 0; i<armyContainer.numChildren; i++) { 
      var enemy:Enemy = armyContainer.getChildAt(i) as Enemy; 
      enemy.moveDownABit(); 
      if (newDoodle.hitTestObject(enemy)) 
      { 
       //gotoAndPlay ("Game Over"); 
       //removeChild(enemy); 
       childs.push(enemy); 
       liveLives -= 1; 
       theLives.text = liveLives.toString(); 

      } 
     } 

     for each (var child:Enemy in childs) 
     { 
      armyContainer.removeChild(child); 
     } 
    } 
相关问题