XNA NullReference异常,在数组中加载纹理时

时间:2012-12-07 12:28:59

标签: c# reference xna nullreferenceexception

好吧我很难过,我通常可以通过使用Google或常识找出大多数错误,但是这个让我感到难过!

我正在尝试将纹理加载到我的struct中的一个敌人数组(就像空间入侵者中的一行),但是当我去调试时会抛出一个Null Reference,我知道这意味着我正在尝试访问不存在的东西,我相信这是因为我称之为:

Inside Initialize我调用我的方法:

Targets.setupSprite(this);

这是struct中的实际方法:

  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设置纹理之前。 它建议使用“ new ”,但我不确定如何在此处使用它。

您可能已经猜到的抛出错误的行是:

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;

            }


        }

P.s应该注意的是,几乎相同的面包和奶酪结构(除了是一个精灵而不是一个数组)工作正常。

2 个答案:

答案 0 :(得分:2)

我仍然怀疑,在Target结构中你没有初始化这个sprites []数组; 因此,在执行时sprites == nullsprites[i] = null;

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

Targets.loadTexture(this); Targets.scaleSprites(this); =&gt;这两个在LoadContent内部调用。

现在,正如msdn所说,Initialize方法是“在创建Game和GraphicsDevice之后调用,但在LoadContent之前调用。”

如果在删除有问题的行之后(我在你在编辑中添加的代码中看到了),则不会抛出与sprites []数组相关的NullPointerException,这意味着,数组已初始化但在{{1 }}。 如果它被抛出,可能是你根本没有初始化它。

答案 1 :(得分:1)

异常非常清楚,sprites为空。使用sprites = new Sprite[100](或您需要的任何类别和大小)对其进行实例化,您就可以了。