2015-05-28 36 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); 
     } 
    } 
相關問題