2016-03-01 95 views
0

這是我的代碼,我到目前爲止爲什麼Flash輸出TypeError:Error#2007:參數子項必須爲非null。在flash.display一::級DisplayObjectContainer /的addChild()

package { 

    import flash.display.MovieClip; 
    import flash.events.*; 

    public class Main extends MovieClip { 

     var leftpressed:Boolean = false; 
     var rightpressed:Boolean = false; 

     public function Main() 
     { 
      //constructor code 
      Spaceship.addEventListener(Event.ENTER_FRAME, moveToKey); 
      stage.addEventListener(KeyboardEvent.KEY_DOWN, setKeyPress); 
      stage.addEventListener(KeyboardEvent.KEY_UP, setKeyUnpress); 
      stage.addEventListener(KeyboardEvent.KEY_DOWN, FlyBullet);  
     }  

     function moveToKey (event:Event) 
     { 
      if (leftpressed && (Spaceship.x>0)) 
      { 
       Spaceship.x = -5; 
      } 
      if (rightpressed && (Spaceship.x<550)) 
      { 
       Spaceship.x = +5; 
      } 

     }  

     function setKeyPress(e:KeyboardEvent):void 
     { 
      if (e.keyCode == 37) 
      { 
       leftpressed = true; 
      } 
      if (e.keyCode == 39) 
      { 
       rightpressed = true; 
      } 
     } 

     function setKeyUnpress(e:KeyboardEvent): void 
     { 
      if (e.keyCode == 37) 
      { 
       leftpressed = false; 
      } 
      if (e.keyCode == 39) 
      { 
       rightpressed = false; 
      } 

     } 

     function FlyBullet (e:KeyboardEvent):void 
     {   
      if (e.keyCode == 32) 
      var bulletshot:Bullet = new Bullet(); 
      addChild(bulletshot); 
      bulletshot.x = Spaceship.x; 
      bulletshot.y = Spaceship.y 
     } 

    } 
} 

與輸出的列爲

TypeError: Error #2007: Parameter child must be non-null. 
at flash.display::DisplayObjectContainer/addChild() 
at Main/FlyBullet() 
誤差的最後FlyBullet功能的最大問題
+0

請指定您要完成的任務(所需輸出)。 –

回答

1

這是你的問題:

if (e.keyCode == 32) 
var bulletshot:Bullet = new Bullet(); 
addChild(bulletshot); 
bulletshot.x = Spaceship.x; 
bulletshot.y = Spaceship.y 

有沒有大括號所以if條件僅適用於第一行,bulletshot被分配。換句話說,如果您按除SPACE以外的任意鍵,它將跳過bulletshot的分配,但仍嘗試addChild(bulletshot),但由於bulletshot未分配值,因此它爲null,並且出現錯誤。

我想你的意思是這樣的:

if (e.keyCode == Keyboard.SPACE) { 
    var bulletshot:Bullet = new Bullet(); 
    addChild(bulletshot); 
    bulletshot.x = Spaceship.x; 
    bulletshot.y = Spaceship.y 
} 

PS:你的代碼是在很多地方不好縮進。它有助於正確縮進代碼。自動格式化程序可以幫助你。

1

通常認爲在多行if語句中省略括號通常被認爲是不好的做法,這是一個例子。每當e.keyCode != 32addChild行將嘗試運行。

解決辦法是:

///...in the Main function// 
stage.addEventListener(KeyboardEvent.KEY_DOWN, flyBullet); 
///... 
function flyBullet (e:KeyboardEvent):void 
{ 

    if (e.keyCode == 32) 
    { 
     var bulletshot:Bullet = new Bullet(); 
     addChild(bulletshot); 
     bulletshot.x = Spaceship.x; 
     bulletshot.y = Spaceship.y; 
    } 
} 

一些無關AS3代碼質量的提示,到後來避免可能的錯誤:

我猜Spaceship不是一個靜態類,所以我建議對於變量/函數名使用小寫第一個字母,對於類使用大寫,但這只是一個好習慣,不會影響您的代碼正確性。

定義您的功能的可訪問性也是一種很好的做法,例如public, private, internal, protected。如果您省略,則默認爲internal

只有在必要時在條件之後跳過括號。

+0

^與我的答案相同(在此之前發佈)。此外,它不是「被認爲是錯誤的做法,省略了多行'if語句'中的括號,它根本不可能*具有多行if語句而沒有括號。在條件「必要」之後跳過括號時,我也很好奇。這不是必要的,它是可選的,主要取決於個人意見。 – Aaron

相關問題