2012-12-07 88 views
1

好吧,我被困在這裏,通常我可以找出大多數錯誤,通過使用谷歌或常識,但這一個讓我難住!我試圖加載紋理到我的結構內的敵人數組(如空間侵略者的行),但是當我去調試它拋出一個空引用,我知道這意味着我試圖訪問的東西是不存在的,我相信這是因爲我在調用這個:XNA NullReference例外,當在數組中加載一個紋理

裏面初始化我打電話給我的方法:

Targets.setupSprite(this); 

這是從結構內部的實際方法:

public void setupSprite(Game1 g) 
     { 

      widthFactor = 0.05f; 
      rowSize = 15; 
      spriteSpacingY = spriteRectangle.Height + 5; 

      for (int i = 0; i < rowSize; i++) 
      { 
       if (i < 15) 
        spriteSpacing = 10; 



       sprites[i].spriteTexture = g.texture; 


       x = 0 + (i * spriteSpacing); 
       y = spriteSpacingY; 
       visible = true; 

      } 


     } 

紋理可以由Content Loader設置之前。 它建議使用'',但我不知道如何在這裏使用它。

拋出的錯誤,因爲你可能已經猜到了該生產線是:

sprites[i].spriteTexture = g.texture; 

g.texture是敵人的質地和位於加載內容。

任何幫助將不勝感激!

附加代碼:目標結構內

protected override void Initialize() 
    { 
     displayHeight = GraphicsDevice.Viewport.Height; 
     displayWidth = GraphicsDevice.Viewport.Width; 

     new TargetRowStruct(); 

      BreadBat.setupSprite(this); 
      CheeseBall.setupSprite(this); 
      Targets.setupSprite(this); 

     base.Initialize(); 
    } 
    protected override void LoadContent() 
    { 
     // Create a new SpriteBatch, which can be used to draw textures. 
     spriteBatch = new SpriteBatch(GraphicsDevice); 

     texture = this.Content.Load<Texture2D>("Handsome"); 
     swag = this.Content.Load<Texture2D>("swag"); 
     back = this.Content.Load<Texture2D>("Backdrop"); 
     font = this.Content.Load<SpriteFont>("FontA"); 


     backRect.Width = (int)displayWidth; 
     backRect.Height = (int)displayHeight; 

     BreadBat.loadTexture(this); 
     CheeseBall.loadTexture(this); 
     Targets.loadTexture(this); 

     BreadBat.scaleSprites(this); 
     CheeseBall.scaleSprites(this); 
     Targets.scaleSprites(this); 




    } 

相關的代碼:

public void scaleSprites(Game1 g) 
     { 

      for (int i = 0; i < rowSize; i++) 
      { 

       sprites[i].spriteRectangle.Width = (int)((g.displayWidth * sprites[i].widthFactor) + .25f); 
       sprites[i].aspectRatio = (int)(sprites[i].spriteTexture.Width/sprites[i].spriteTexture.Height); 
       sprites[i].spriteRectangle.Height = sprites[i].spriteRectangle.Width; 
      } 
     } 

     public void loadTexture(Game1 g) 
     { 
      for (int i = 0; i < rowSize; i++) 
      {     
       sprites[i].spriteTexture = g.texture; 
      } 
     } 

     public void drawSprite(Game1 g) 
     { 
      g.spriteBatch.Draw(spriteTexture, spriteRectangle, Color.White); 

      for (int i = 0; i < rowSize; i++) 
      { 
       if (sprites[i].visible) 
       { 
        g.spriteBatch.Draw(sprites[i].spriteTexture, sprites[i].spriteRectangle, Color.White); 
       } 
      } 
     } 

     public void setupSprite(Game1 g) 
     { 

      widthFactor = 0.05f; 
      rowSize = 15; 
      spriteSpacingY = spriteRectangle.Height + 5; 

      for (int i = 0; i < rowSize; i++) 
      { 
       if (i < 15) 
        spriteSpacing = 10; 






       x = 0 + (i * spriteSpacing); 
       y = spriteSpacingY; 
       visible = true; 

      } 


     } 

詩應當注意的是,麪包和奶酪結構,其幾乎是相同的(除了是一個子畫面,而不是一個數組)工作正常。

回答

2

我仍然懷疑,那裏面的Target結構體你並沒有初始化這個sprites []數組;因此,無論是在執行時間sprites == null還是sprites[i] = null;

正如我所看到的,在目標上調用了三個方法,一個是在Initialize中調用的Targets.setupSprite(this);

Targets.loadTexture(this); Targets.scaleSprites(this); =>這兩個在LoadContent中調用。

現在,作爲msdn狀態,Initialize方法是「在遊戲和GraphicsDevice創建後調用,但在LoadContent之前調用」。

如果刪除有問題的行(我看到你在你的代碼中添加編輯所做的)之後,NullPointerException異常不相關[]數組,這意味着,該數組初始化,但是Targets.setupSprite(this);後的地方甩出去精靈。 如果它被拋出,可能是你沒有初始化它。

1

異常很清楚,sprites爲空。使用sprites = new Sprite[100](或者您需要的任何類和大小)對它進行實例化,並且您很好。

+0

現在感覺像個白癡:我非常喜歡! – user1885395