2012-12-07 46 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